程序用于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;

解决方案 »

  1.   

    1.确认一下之前那个进程ID是否已经又被其它进程占用了
    2.返回值并不代表一切,关注一下GetLastError
      

  2.   

    PID被顶替的可能性比较大,一般是这么操作,进入主操作流程时,OpenProcess,然后主操作流程一直针对这个hProcess,如果操作失败那很可能是目标进程退出了.
      

  3.   

    在任务管理器中没有看到又出现相同PID的进程。"然后主操作流程一直针对这个hProcess"请教是做什么操作
      

  4.   

    另外,还有一问,为什么以上代码,我将 terminateprocess(AHandle,exitcode); 换成  CloseHandle(AHandle); 就关闭不了进程?
      

  5.   

    你改成这样试试:
       AHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, vProcessID);
       if AHandle <> 0 then
       begin
         repeat
           Terminateprocess(AHandle,exitcode);
         until GetExitCodeProcess(AHandle,exitcode) and (exitcode <> STILL_ACTIVE);
         CloseHandle(AHandle)
       end;
      

  6.   

    建议你找本讲 win32 api 的书再好好看看有关内核对象的章节。这种情况显然描述被结束进程的内核对象无法得到关闭,你这么用会造成该内核对象的引用计数不正确,直到你的这个进程结束之后才能得到释放
      

  7.   


    谢谢,这个方法可用。我想知道 用 GetExitCodeProcess(AHandle,exitcode) and (exitcode <> STILL_ACTIVE) 来判断和通过快照枚举所有PID,进行判断的方法谁更准确。
      

  8.   

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