@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, и выводить соответствующее сообщение в зависимости от его результата.