如何检查给定句柄是否有进程运行
How to check is there a process running with the given handle
场景:
从 App1,我需要执行 App2 传递 App1.Handle 作为参数。
App2 应该等到 App1 关闭。此后,App2 应将 App1.exe 文件替换为更新版本。
- 是否有更好的方法来更新 运行 可执行文件?
- 如果没有..在 App2 中,我知道 App1.Handle 我应该检查一下
如果 App1 已关闭。如何从
App1.Handle?
编辑:
应用程序 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 或其他值来测试的方法...
场景: 从 App1,我需要执行 App2 传递 App1.Handle 作为参数。 App2 应该等到 App1 关闭。此后,App2 应将 App1.exe 文件替换为更新版本。
- 是否有更好的方法来更新 运行 可执行文件?
- 如果没有..在 App2 中,我知道 App1.Handle 我应该检查一下 如果 App1 已关闭。如何从 App1.Handle?
编辑:
应用程序 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 或其他值来测试的方法...