Если бы колбаса продавалась так же как программное обеспечение, то под прозрачной оберткой у нее было бы следующее соглашение:
1) изготовитель не гарантирует совместимость данного продукта с организмом и не несет никаких последствий за его употребление;
2) потребителю запрещается исследовать содержимое этой колбасы (например, на наличие крысиных хвостов);
3) покупатель может сьесть колбасу, но все равно не станет ее владельцем;
4) употребить колбасу может только один человек;
5) покупатель не может продать колбасу кому-либо;
6)производитель не гарантирует, что данный продукт свободен от ошибок (например, от примесей цианистого калия);
7) возможная ответственность за здоровье покупателя не может превысить стоимость колбасы;
8) разрывая обертку, покупатель принимает условия данного соглашения.
var
Form1: TForm1;
// Глобальные переменные:
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
StartEn: Boolean = False;
implementation{$R *.DFM}// Запуск процессаprocedure TForm1.StartButtonClick(Sender: TObject);
var
CmdStr: PChar; // Командная строка для запуска приложенияbegin
CmdStr := PChar(FilenameEdit1.FileName); // Определение командной строки
StartEn := False; // Запущено ли приложение// Без этого приложение не стартует =<
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_NORMAL; // Состояние окна запущенного приложения// <= Без этого приложение не стартует// Запускаем процесс
StartEn := CreateProcess(nil,
CmdStr, { указатель командной строки }nil, { указатель на процесс атрибутов безопасности }nil, { указатель на поток атрибутов безопасности }False, { флаг родительского обработчика }
CREATE_NEW_CONSOLE or{ флаг создания }
NORMAL_PRIORITY_CLASS,
nil, { указатель на новую среду процесса }nil, { указатель на имя текущей директории }
StartupInfo, { указатель на STARTUPINFO }
ProcessInfo); { указатель на PROCESS_INF }
EndButton.Enabled := StartEn;
end;
// Терминация процессаprocedure TForm1.EndButtonClick(Sender: TObject);
beginif StartEn thenbegin
ProcessInfo.hProcess := OpenProcess(PROCESS_TERMINATE, False,
ProcessInfo.dwProcessId);
if ProcessInfo.hProcess <> Null thenbegin
TerminateProcess(ProcessInfo.hProcess, 0);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
end;
StartEn := False;
EndButton.Enabled := StartEn;
end;
Статья - это юмористическое сравнение между продажей колбас и лицензированием программного обеспечения, подчеркивающее различия в том, как клиенты обрабатываются. Код-снippet, предоставленный ниже, является приложением Delphi, которое запускает и останавливает процесс.
StartButtonClick
Определяет строку команды (CmdStr) из FilenameEdit1.FileName, которая, вероятно, является полем ввода для пользователя, чтобы указать файл исполняемого файла.
Устанавливает StartEn (логическое переменная) в False, указывая, что процесс не был запущен еще.
Инициализирует структуру TStartupInfo и заполняет ее нулями с помощью FillChar.
Устанавливает различные поля структуры TStartupInfo, такие как cb (размер структуры), dwFlags (набор флагов, указывающих, как запустить процесс) и wShowWindow (определяющий состояние окна).
Создает новый процесс с помощью CreateProcess, передавая различные параметры:
CmdStr: строка команды
nil: нет атрибутов безопасности для процесса
nil: нет атрибутов безопасности для потока
False: не наследовать handles родительского процесса
CREATE_NEW_CONSOLE и NORMAL_PRIORITY_CLASS: создать новый консольный окно с нормальным классом приоритета
nil: нет нового блока окружения
nil: текущий каталог
StartupInfo: структура STARTUPINFO
ProcessInfo: структура PROCESS_INFORMATION
EndButtonClick
Проверяет, является ли StartEn истинным, указывая, что процесс был запущен.
Если так, открывает процесс с помощью OpenProcess, specifies terminate flag (PROCESS_TERMINATE) и закрывает handles для потока и процесса.
Код обеспечивает基本ную функциональность запуска и остановки процесса, но стоит отметить:
Код не обрабатывает ошибки или исключения должным образом.
Он предполагает, что пользователь правильно ввел имя файла исполняемого файла в FilenameEdit1.FileName.
Он не предоставляет никакой обратной связи пользователю о успехе или неудаче запуска/остановки процесса.
В отношении предложений, следующие несколько:
Реализуйте правильную обработку ошибок и исключений с помощью блоков try-except.
Проверьте ввод пользователя (например, проверьте, существует ли файл) перед попыткой запустить процесс.
Предоставьте визуальную обратную связь пользователю о статусе процесса (например, используя прогресс-бар или сообщение об ошибке).
Рассмотрите использование более современных функций Delphi, таких как синтаксис async/await для асинхронного программирования.
В статье описывается способ корректного завершения выполнения приложения в Delphi, а также приведен пример использования функции CreateProcess для запуска нового процесса и функции TerminateProcess для его терминации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.