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

k39k39 2012-08-02 05:49:41
程序用于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;

...全文
178 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
s11ss 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 7 楼 的回复:

你改成这样试试:
Delphi(Pascal) code
AHandle := OpenProcess(PROCESS_TERMINATE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, vProcessID);
if AHandle <> 0 then
begin
repeat
Ter……
……
[/Quote]
在调用TerminateProcess的情况下,因为由你指定进程退出码,所以两种方法都一样准确。
但是如果是进程自己结束自己,那么通过快照枚举所有PID更准确。因为它的退出码如果恰好指定为STILL_ACTIVE(比如ExitProcess(STILL_ACTIVE)),那么GetExitCodeProcess就不能正确判断了。。。

另外7楼的代码不够严谨,改成这样:
[Quote]
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;
[/Quote]
k39k39 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

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

谢谢,这个方法可用。

我想知道 用 GetExitCodeProcess(AHandle,exitcode) and (exitcode <> STILL_ACTIVE) 来判断和通过快照枚举所有PID,进行判断的方法谁更准确。
Seamour 2012-08-03
  • 打赏
  • 举报
回复
建议你找本讲 win32 api 的书再好好看看有关内核对象的章节。这种情况显然描述被结束进程的内核对象无法得到关闭,你这么用会造成该内核对象的引用计数不正确,直到你的这个进程结束之后才能得到释放
s11ss 2012-08-03
  • 打赏
  • 举报
回复
你改成这样试试:
   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;
k39k39 2012-08-03
  • 打赏
  • 举报
回复
另外,还有一问,为什么以上代码,我将 terminateprocess(AHandle,exitcode); 换成 CloseHandle(AHandle); 就关闭不了进程?
k39k39 2012-08-03
  • 打赏
  • 举报
回复
在任务管理器中没有看到又出现相同PID的进程。

"然后主操作流程一直针对这个hProcess"

请教是做什么操作
s11ss 2012-08-03
  • 打赏
  • 举报
回复
试试CloseHandle
蓝色光芒 2012-08-03
  • 打赏
  • 举报
回复
PID被顶替的可能性比较大,一般是这么操作,进入主操作流程时,OpenProcess,然后主操作流程一直针对这个hProcess,如果操作失败那很可能是目标进程退出了.
kaikai_kk 2012-08-03
  • 打赏
  • 举报
回复
枚举所有进程检查
JPEXE 2012-08-02
  • 打赏
  • 举报
回复
1.确认一下之前那个进程ID是否已经又被其它进程占用了
2.返回值并不代表一切,关注一下GetLastError

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧