我知道这是有点晚了,但你的代码应该这样写的,如果你想你所期望的结果。
bool isProcessRunning(HANDLE process)
{
DWORD exitCodeOut;
// GetExitCodeProcess returns zero on failure
if(GetExitCodeProcess(process, &exitCodeOut) == 0)
{
// Optionally get the error
// DWORD error = GetLastError();
return false;
}
// Return if the process is still active
return exitCodeOut == STILL_ACTIVE;
}
如果你只有进程ID(PID),这个片段将工作(没有错误检查):
bool isProcessRunning(DWORD processID)
{
if(HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processID))
{
DWORD exitCodeOut;
// GetExitCodeProcess returns zero on failure
if(GetExitCodeProcess(process, &exitCodeOut) != 0)
{
// Return if the process is still active
return exitCodeOut == STILL_ACTIVE;
}
}
return false;
}
只需要添加一个检查对INVALID_HANDLE_VALUE因为报告该进程正在运行当它甚至不是有效的:) – 2009-08-06 12:01:04
像WaitForSingleObject这样的API如果你有一个进程句柄是开放的,即使它终止了,也不应该返回INVALID_HANDLE_VALUE。句柄和底层对象必须保持打开状态,直到由引用进程明确关闭(或终止这些进程)。你确定你没有试图在进程ID上调用它,而不是一个句柄? – 2009-08-07 20:22:18
我的意思是在WaitForSingleObject之前进行检查,如果进程尚未创建,所以句柄仍处于我初始化的值,即INVALID_HANDLE_VALUE,因为将INVALID_HANDLE_VALUE传递给WaitForSingleObject总是超时(即INVALID_HANDLE_VALUEis从不它似乎是一个信号状态)。 – 2009-08-13 19:05:01