Delphi: Как запустить приложение с поднятым состоянием и ожидать его для завершения?

Под use strict, скажите:

(my $new = $original) =~ s/foo/bar/;

вместо этого.

13
задан croceldon 11 November 2009 в 19:50
поделиться

2 ответа

У меня работает следующий код:

procedure RunFileAsAdminWait(hWnd: HWND; aFile, aParameters: string);
var
  sei: TShellExecuteInfo;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.Wnd := hWnd;
  sei.fMask := SEE_MASK_FLAG_NO_UI or SEE_MASK_NOCLOSEPROCESS;
  sei.lpVerb := 'runas';
  sei.lpFile := PChar(aFile);
  sei.lpParameters := PChar(aParameters);
  sei.nShow := SW_SHOWNORMAL;

  if not ShellExecuteEx(@sei) then
    RaiseLastOSError;
  if sei.hProcess <> 0 then begin
    while WaitForSingleObject(sei.hProcess, 50) = WAIT_TIMEOUT do
      Application.ProcessMessages;
    CloseHandle(sei.hProcess);
  end;
end;

Вы должны передать флаг SEE_MASK_NOCLOSEPROCESS , чтобы обработчик процесса ждал. Я также изменил код на цикл, пока WaitForSingleObject () возвращается с таймаутом.

Для получения дополнительной информации о флагах см. Страницу MSDN для структуры SHELLEXECUTEINFO .

15
ответ дан 1 December 2019 в 23:31
поделиться

Ваше ожидание (50 мсек слишком мало), попробуйте

WaitForSingleObject(sei.hProcess, INFINITE)

Проверку действительного дескриптора процесса (sei.hProcess <> 0) можно не учитывать.

Исправленный ответ:

  while MsgWaitForMultipleObjects(1, sei.hProcess, False, INFINITE, QS_ALLINPUT)
    <> WAIT_OBJECT_0 do
  begin
    while PeekMessage(msg, 0, 0, 0, PM_REMOVE) do
    begin
      DispatchMessage(Msg);
    end;
  end;
0
ответ дан 1 December 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: