@terrence
Функция ShellExecute
возвращает тип HINSTANCE
, который представляет собой дескриптор экземпляра приложения, запущенного в результате вызова функции ShellExecute
. Она не предназначена для получения информации о результате запуска приложения или его выполнении.
Для вывода сообщения после выполнения ShellExecute
в Delphi можно использовать функцию WaitForSingleObject
. Эта функция блокирует выполнение программы, пока не завершится процесс, который был запущен с помощью ShellExecute
.
Вот пример кода, который показывает, как использовать WaitForSingleObject
для ожидания завершения процесса, запущенного с помощью ShellExecute
, и вывода сообщения в зависимости от его результата:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var sei: TShellExecuteInfo; hProcess: THandle; begin // запускаем процесс с помощью ShellExecute FillChar(sei, SizeOf(sei), 0); sei.cbSize := SizeOf(sei); sei.fMask := SEE_MASK_NOCLOSEPROCESS; sei.lpVerb := 'open'; sei.lpFile := 'C:path omyexecutable.exe'; ShellExecuteEx(@sei); // ждем завершения процесса hProcess := sei.hProcess; if hProcess <> 0 then begin WaitForSingleObject(hProcess, INFINITE); // выводим сообщение в зависимости от кода возврата процесса if GetExitCodeProcess(hProcess, ExitCode) then begin if ExitCode = 0 then ShowMessage('Процесс завершен успешно') else ShowMessageFmt('Процесс завершен с кодом %d', [ExitCode]); end; end; end; |
Обратите внимание, что ShellExecuteEx
должна быть использована вместо устаревшей функции ShellExecute
, чтобы получить дескриптор процесса через параметр hProcess
. Также в этом примере предполагается, что используется стандартная функция ShowMessage
, которая выводит сообщение на экран.
@terrence
Для корректной работы кода необходимо включить модуль ShellAPI
и объявить переменные ExitCode
типа DWORD
, sei
типа TShellExecuteInfo
и hProcess
типа THandle
. Для этого добавьте следующие строки в раздел uses
:
1 2 |
uses ..., ShellAPI, Windows; |
Также в примере кода пропущена инициализация переменной ExitCode
, её можно объявить и проинициализировать перед вызовом GetExitCodeProcess
:
1 2 3 4 5 6 7 |
var sei: TShellExecuteInfo; hProcess: THandle; ExitCode: DWORD; begin // инициализация переменной ExitCode ExitCode := 0; |
Исправленный код с учетом этих изменений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
uses ..., ShellAPI, Windows; var sei: TShellExecuteInfo; hProcess: THandle; ExitCode: DWORD; begin // инициализация переменной ExitCode ExitCode := 0; // запускаем процесс с помощью ShellExecute FillChar(sei, SizeOf(sei), 0); sei.cbSize := SizeOf(sei); sei.fMask := SEE_MASK_NOCLOSEPROCESS; sei.lpVerb := 'open'; sei.lpFile := 'C:path omyexecutable.exe'; ShellExecuteEx(@sei); // ждем завершения процесса hProcess := sei.hProcess; if hProcess <> 0 then begin WaitForSingleObject(hProcess, INFINITE); // выводим сообщение в зависимости от кода возврата процесса if GetExitCodeProcess(hProcess, ExitCode) then begin if ExitCode = 0 then ShowMessage('Процесс завершен успешно') else ShowMessageFmt('Процесс завершен с кодом %d', [ExitCode]); end; end; end; |
Теперь код должен корректно ожидать завершения процесса, запущенного с помощью ShellExecute
, и выводить соответствующее сообщение в зависимости от его результата.