C++ 检查进程ID时使用WaitForSingleObject的好处
在这里使用C++ 检查进程ID时使用WaitForSingleObject的好处,c++,winapi,pid,C++,Winapi,Pid,在这里使用WaitForSingleObject与不使用它相比有什么好处?第一个代码块来自一个。第二个问题是我是怎么做的 BOOL IsProcessRunning(DWORD pid) { HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid); DWORD ret = WaitForSingleObject(process, 0); CloseHandle(process); return (ret == W
WaitForSingleObject
与不使用它相比有什么好处?第一个代码块来自一个。第二个问题是我是怎么做的
BOOL IsProcessRunning(DWORD pid)
{
HANDLE process = OpenProcess(SYNCHRONIZE, FALSE, pid);
DWORD ret = WaitForSingleObject(process, 0);
CloseHandle(process);
return (ret == WAIT_TIMEOUT);
}
vs
似乎使用需要更高的权限,我只想检查当前用户的PID。WaitForSingleObject将等待进程完成/退出。只有这样它才会返回。当一个进程完成时,它会停止运行,但直到关闭它的最后一个句柄,它才会消失。第一种解决方案区分这两种状态(仍在运行或已完成运行)。当然,当答案返回时,它可能已经过时了
如果您不需要这种区别,那么您的方法是好的(尽管我会将函数命名为DoesProcessExist)。iProcessRunning的实现也可以使用GetExitCodeProcess Win32 API。零超时是Ingeniosis的一部分(希望我拼写正确),它会立即超时(=进程正在运行)或失败(=僵尸进程)。要添加一些比较工作,您可能需要将
GetExitCode
与WaitForSingleObject
进行比较,以确定进程完成状态。如果进程故意返回259(仍处于活动状态
),该怎么办作为它的退出代码?我还想添加一个进程ID,从理论上讲,它可以被重用。因此,每次都用它的ID打开进程通常不是一个好主意。最好打开它的句柄一次(或者保存它,如果你创建了它,或者从第三方获得了它)。
BOOL IsProcessRunning(DWORD pid)
{
HANDLE process = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, pid);
const bool exists = (process != NULL);
CloseHandle(process);
return exists;
}