我知道這是有點晚了,但你的代碼應該這樣寫的,如果你想你所期望的結果。
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