我需要检查具有给定HANDLE的进程是否仍在运行,我尝试使用以下代码执行此操作,但它始终在第二次返回false时返回,即使进程正在运行。
bool isProcessRunning(HANDLE process)
{
if(process == INVALID_HANDLE_VALUE)return false;
DWORD exitCode;
if(GetExitCodeProcess(process, &exitCode) != 0)
return false;//always returns here
return GetLastError() == STILL_ACTIVE;//still running
}
答案 0 :(得分:6)
您可以使用
测试过程寿命bool isProcessRunning(HANDLE process)
{
return WaitForSingleObject( process, 0 ) == WAIT_TIMEOUT;
}
答案 1 :(得分:2)
http://msdn.microsoft.com/en-us/library/ms683189%28VS.85%29.aspx
返回值
如果功能成功,则返回 价值非零。
如果功能 失败,返回值为零。至 获取扩展错误信息,调用 GetLastError函数
答案 2 :(得分:1)
我知道这有点晚了,但是如果你想要你想要的结果,你的代码应该是这样的。
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;
}
答案 3 :(得分:0)
您可以使用EnumProcesses()
让所有进程在Windows上运行。
类似的东西:
bool IsProcessRunning(int pid)
{
unsigned long processes[2048];
unsigned long num_proc = 0;
unsigned long needed = 0;
// assume that 2048 processes are enought
if (EnumProcesses(processes, sizeof(processes), &needed))
num_proc = needed / sizeof(DWORD);
for (int i = 0; i < num_proc; i++)
if (processes[i] == pid)
return true;
return false;
}