首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

2013-01-14 
为什么关闭另一进程后,仍然能检测到句柄?程序用于A进程 关闭 B进程,如下代码中,vProcessID 是B进程的PID,

为什么关闭另一进程后,仍然能检测到句柄?
程序用于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;

热点排行