function WinExecute(CmdLine: string; Wait: Boolean): Boolean;
var
StartupInfo: TStartupInfo;
ProcessInformation: TProcessInformation;
begin
Result := True;
try
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
StartupInfo.cb := SizeOf(StartupInfo);
ifnot CreateProcess(nil, PChar(CmdLine), nil, nil, True, 0, nil,
nil, StartupInfo, ProcessInformation) then
RaiseLastWin32Error;
if Wait then
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
except
Result := False;
end;
end;
Вот перевод текста на русский язык:
Функция Delphi, называемая WinExecute, выполняет командную строку в Windows с помощью функции API CreateProcess. Функция принимает два параметра:
CmdLine: строка, представляющая командную строку для выполнения.
Wait: булевое значение, указывающее, нужно ли ждать завершения процесса перед возвращением.
Вот что происходит в коде:
1. Инициализируется структура StartupInfo, используемая для передачи информации о новом процессе функции CreateProcess. Структура заполняется нулями с помощью FillChar.
2. Устанавливается поле cb структуры StartupInfo в размер самой структуры.
3. Вызывается функция CreateProcess, создавая новый процесс, выполняющий команду, указанную в CmdLine. Функция принимает несколько параметров:
* nil: handle родительского окна (не используется)
* PChar( CmdLine ): команда для выполнения
* nil: указатель на атрибуты безопасности (не используется)
* nil: указатель на блок окружающей среды (не используется)
* True: наследовать handles от родительского процесса
* 0: флаги создания (не используется)
* nil: указатель на атрибуты безопасности нового потока (не используется)
* nil: указатель на блок окружающей среды нового потока (не используется)
* StartupInfo: структура начальной информации
* ProcessInformation: указатель на структуру TProcessInformation, заполняемую информацией о новом процессе
4. Если функция CreateProcess fails, она поднимает исключение Win32Exception с помощью функции RaiseLastWin32Error.
5. Если Wait равно True, функция ждет завершения процесса с помощью WaitForSingleObject.
6. Если происходит исключение при выполнении (например, из-за тай아ута или ресурсной ошибки), функция устанавливает Result в False.
Функция возвращает булевое значение, указывающее, была ли команда выполнена успешно.
Альтернативное решение:
Вы можете использовать функцию ShellExecuteEx, которая более удобна для выполнения команд и ожидания их завершения:
Функция ShellExecuteEx выполняет команду и ждет ее завершения. Она более удобна потому, что она заботится о многих деталях автоматически, таких как создание нового процесса и ожидание его завершения. Однако она может не предоставлять такой же уровень контроля над процессом выполнения, как оригинальный код с использованием CreateProcess.
Функция WinExecute в Delphi для ожидания завершения выполнения DOS-задачи с помощью CreateProcess и WaitForSingleObject.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.