如何检查给定句柄是否有进程运行

How to check is there a process running with the given handle

场景: 从 App1,我需要执行 App2 传递 App1.Handle 作为参数。 App2 应该等到 App1 关闭。此后,App2 应将 App1.exe 文件替换为更新版本。

编辑:

应用程序 1:

var
  ProcessHandle : THandle;
begin
  ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, GetCurrentProcessId());
  //Is PROCESS_ALL_ACCESS needed?
  ShellExecute(0, 'open', 'App2.exe', PChar(IntToStr(ProcessHandle)), '.\', SW_SHOW);
end;

应用程序 2:

var
  SenderHandle : THandle;
begin
  if(ParamStr(1) <> '') then
  begin
    SenderHandle := StrToInt(ParamStr(1));
    WaitForSingleObject(SenderHandle, INFINITE);
    ShowMessage('App1 Terminated!');
    //Showmessage is executed when App1 is still running, what's wrong?
  end;
end;

App1.Handle 表示 window 句柄。 App2 需要等待 App1 的 进程句柄 。要获取 App1 的进程句柄,请使用 OpenProcess()GetCurrentProcessId() 作为进程 ID,或使用 DuplicateHandle()GetCurrentProcess() 作为源句柄。然后您可以将句柄传递给 App2,并让 App2 使用 WaitForSingleObject() 等待它。当 App1 退出时,句柄将发出信号。然后 App2 可以关闭句柄并替换 App1.exe.

为什么要使用 PID 等待进程终止?为什么不尝试覆盖文件呢?只要进程还在运行,就不能覆盖.EXE文件。

即。类似于:

WHILE NOT CopyFile(NewVersion,InstalledVersion) DO Sleep(100);

当然,您可以加入超时和其他保护措施,但上面向您展示了另一种无需 PID 或其他值来测试的方法...