{ **** UBPFD *********** by delphibase.endimus.com ****
>> Дождаться завершение внешнего приложения
Дожидается завершения внешнего процесса
Зависимости: shellAPI
Автор: elena_tark, elena_tark@freemail.ru, Калуга
Copyright: Собственное
Дата: 1 августа 2003 г.
***************************************************** }procedure ShellExec(Sender: TObject);
var
ProcInfo: PShellExecuteInfo;
begin
(Sender as TControl).Enabled := False;
GetMem(ProcInfo, SizeOf(ProcInfo^));
with ProcInfo^ dobegin
Wnd := Handle;
cbSize := SizeOf(ProcInfo^);
lpFile := PChar('notepad.exe');
lpParameters := nil;
lpVerb := 'open';
nShow := SW_SHOW;
fMask := SEE_MASK_DOENVSUBST or SEE_MASK_NOCLOSEPROCESS;
end;
try
Win32check(ShellExecuteEx(ProcInfo));
whilenot Application.Terminated and
(WaitForSingleObject(ProcInfo.hProcess, 100) = WAIT_TIMEOUT) do
Application.ProcessMessages;
finallyif ProcInfo.hProcess <> 0 then
CloseHandle(ProcInfo.hProcess);
Dispose(ProcInfo);
(Sender as TControl).Enabled := True;
end;
end;
Программный код на языке Delphi, демонстрирующий выполнение внешней приложения (в этом случае, Notepad.exe) и ожидание его завершения работы. Вот разбивка кода:
Инициализация
Процедура ShellExec объявлена с параметром Sender: TObject, что является общей практикой в Delphi при создании обработчиков событий.
Размещение памяти
Пойnter к структуре PShellExecuteInfo (Windows API) выделяется функцией GetMem. Эта структура будет хранить информацию о внешнем приложении, которое будет выполнено.
Настройка информации о shell-выполнении
Блок with ProcInfo^ do настраивает поля структуре ProcInfo:
Wnd: Устанавливает handle окна для операции shell-выполнения.
cbSize: Определяет размер структуры ProcInfo.
lpFile: Определяет исполняемый файл, который будет запущен (в этом случае, Notepad.exe).
lpParameters: Устанавливается в nil, потому что в этом примере неNeeded параметры.
lpVerb: Устанавливает верб для операции shell-выполнения (в этом случае, "open").
nShow: Определяет, как приложение должно быть отображено при запуске (в этом случае, SW_ SHOW означает, что оно будет отображаться с его default window style).
fMask: Определяет различные флаги для управления выполнением внешнего приложения:
SEE_ MASK_DOENVSUBST: Включает подстановку переменных среды.
SEE_ MASK_NOCLOSEPROCESS: Прерывает закрытие процесса, когда операция shell-выполнения будет завершена.
Выполнение операции shell-выполнения
Функция Win32check используется для вызова функции ShellExecuteEx, которая выполняет внешнее приложение. Структура ProcInfo передается в качестве параметра.
Ожидание завершения внешнего приложения
Цикл while используется для ожидания завершения внешнего приложения. Цикл проверяет два условия:
Application.Terminated: Если приложение было прервано (например, из-за исключения), цикл будет выйти.
WaitForSingleObject(ProcInfo.hProcess, 100) = WAIT_TIMEOUT: Функция ожидает завершения процесса или наступления таймаута. Поле hProcess структуры ProcInfo содержит handle внешнего приложения'а. Если процесс все еще работает после 100 миллисекунд (установленного таймаута), цикл продолжится.
Освобождение ресурсов
В блоке finally код:
Освобождает handle внешнего приложения'а процесса функцией CloseHandle.
Освобождает структуру ProcInfo функцией Dispose.
Включает управление, которое инициировало эту процедуру (предполагается, что оно было отключено ранее).
В целом, этот код демонстрирует, как выполнить внешнее приложение и ожидать его завершения работы в приложении Delphi.
В статье описывается создание процедуры ShellExec в Delphi, которая запускает внешнее приложение и блокирует выполнение программы до тех пор, пока это приложение не будет закрыто.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS