Как вывести сообщение после выполнения shellexecute в delphi?

Пользователь

от terrence , в категории: Другие , 2 года назад

Как вывести сообщение после выполнения shellexecute в delphi?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от buster , 2 года назад

@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, которая выводит сообщение на экран.

Пользователь

от deshaun_cormier , 6 месяцев назад

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