我试图使用下面的函数从进程中获取ID,但是GetLastError不断返回ERROR_NO_MORE_FILES,因此它永远不会有机会遍历所有进程。我不知道什么导致了这一点。有任何想法吗?另外作为测试我在param中传递为“notepad.exe”
int GetProcID(string ProcName){
PROCESSENTRY32 PE32;
HANDLE ProcSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PE32.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(ProcSnapshot,&PE32))
return 0;
else
if(PE32.szExeFile == ProcName)
return PE32.th32ProcessID;
else
{
while(GetLastError() != ERROR_NO_MORE_FILES){
Process32Next(ProcSnapshot,&PE32);
if(PE32.szExeFile == ProcName)
return PE32.th32ProcessID;
}
return 0;
}
}
答案 0 :(得分:2)
您的while
循环错误。即使在调用Process32Next
函数之前,您也不应该检查错误值。如果事先调用Windows API函数(可能是另一个Process32Next
函数)返回ERROR_NO_MORE_FILES
,则函数将返回而不执行任何操作,并且快照中的第一个进程的名称恰好是除了您要搜索的名称。
请注意,并非所有API函数都将错误代码设置为ERROR_SUCCESS
,即使它们已成功(并且在您完成后也不会忘记关闭快照句柄)。