如何正确使用WaitForSingleObject方法等待外部程序终止?

cro*_*don 9 delphi delphi-2007

我正在尝试启动具有提升状态的外部应用程序,并等到它退出后再继续:

var
  FProcess: THandle;
  ExecInfo: TShellExecuteInfo;
begin

  FillChar(ExecInfo, SizeOf(ExecInfo), 0);
  with ExecInfo do
  begin
    cbSize := SizeOf(ExecInfo);
    fMask := 0;
    Wnd := AWindow;
    lpVerb := 'runas';
    lpFile := PChar(APath);
    lpParameters := PChar(AParams);
    lpDirectory := PChar(AWorkDir);
    nShow := SW_NORMAL;
  end;

  Result := ShellExecuteEx(@ExecInfo);

  if Wait then
  begin
    while WaitForSingleObject(ExecInfo.hProcess, INFINITE) <> WAIT_TIMEOUT do
      Application.ProcessMessages;
  end;
Run Code Online (Sandbox Code Playgroud)

这启动了,但它只是在等待.调用程序永远不会继续调用WaitForSingleObject,即使在被调用的程序退出之后也是如此.

我尝试过WAIT_OBJECT_0而不是WAIT_TIMEOUT,但我遇到了同样的问题.我在这做错了什么?

klu*_*udg 12

什么代码

while WaitForSingleObject(ExecInfo.hProcess, INFINITE) <> WAIT_TIMEOUT do
  Application.ProcessMessages;
Run Code Online (Sandbox Code Playgroud)

应该怎么做?这是一个无限循环.

使用公正

WaitForSingleObject(ExecInfo.hProcess, INFINITE);
Run Code Online (Sandbox Code Playgroud)

代替.是的,你需要

fMask:= SEE_MASK_NOCLOSEPROCESS;
Run Code Online (Sandbox Code Playgroud)

获取进程句柄.