读书人

为啥关闭另一进程后仍然能检测到句柄

发布时间: 2013-01-14 17:30:32 作者: rapoo

为什么关闭另一进程后,仍然能检测到句柄?
程序用于A进程 关闭 B进程,如下代码中,vProcessID 是B进程的PID,关闭B进程后,openprocess的返回值AHandle始终不为0,请问是什么原因,该如何通过vProcessID 来检测进程已经被关闭了?



repeat
AHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, vProcessID);

if AHandle<>0 then
begin
GetExitCodeProcess(AHandle,exitcode);
terminateprocess(AHandle,exitcode);

end;

until AHandle=0;


[解决办法]
枚举所有进程检查
[解决办法]
引用:
引用:

你改成这样试试:
Delphi(Pascal) code
AHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, vProcessID);
if AHandle <> 0 then
begin
repeat
Ter……
……

在调用TerminateProcess的情况下,因为由你指定进程退出码,所以两种方法都一样准确。
但是如果是进程自己结束自己,那么通过快照枚举所有PID更准确。因为它的退出码如果恰好指定为STILL_ACTIVE(比如ExitProcess(STILL_ACTIVE)),那么GetExitCodeProcess就不能正确判断了。。。

另外7楼的代码不够严谨,改成这样:
引用
AHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, vProcessID);
if AHandle <> 0 then
begin
while not (GetExitCodeProcess(AHandle,exitcode) and (exitcode <> STILL_ACTIVE)) do
begin
Terminateprocess(AHandle,1);
WaitForSingleObject(AHandle, INFINITE);
end;
CloseHandle(AHandle)
end;

读书人网 >.NET

热点推荐