我正在使用VS C ++ 2010.我需要获得程序状态但似乎当程序说它停止工作时我的功能无效。如果它停止工作,我需要重新启动程序。
我的代码:
BOOL IsProcessRunning(DWORD pid)
{
HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid);
DWORD ret = WaitForSingleObject(process, 0);
CloseHandle(process);
return ret == WAIT_TIMEOUT;
}
答案 0 :(得分:3)
此代码永远不会有效。如果外部进程已停止运行,则OpenProcess
将失败,因为进程已结束且PID不再有效。并且您不检查OpenProcess
返回的值。或者PID已被重复使用,然后你就可以处理错误的过程。
要以可靠的方式使用WaitForSingleObject
,您需要获得流程的句柄并继续使用它。请拨打OpenProcess
一次,然后将该句柄用于对WaitForSingleObject
的所有后续调用。只有在完成该过程的处理后才能调用CloseHandle
。
但是,使用WaitForSingleObject
对于检测程序没有响应是没有用的。在这种情况下,对OpenProcess
的调用将成功,因为该过程仍然存在并且正在运行。由于进程仍在运行,对WaitForSingleObject
的调用将返回WAIT_TIMEOUT
。毕竟,挂起的进程仍在运行。
因此,代码的整个前提是错误的。挂窗(或实际上任何窗口)只能存在于正在运行的进程中!您需要丢弃所拥有的代码,而只需调用IsHungAppWindow
。您将需要应用程序主窗口的窗口句柄。