1

我试图使用下面的函数从进程中获取 ID,但是 GetLastError 不断返回 ERROR_NO_MORE_FILES 所以它永远没有机会遍历所有进程。我不确定是什么原因造成的。有任何想法吗?同样作为测试,我将参数作为“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;
        }
}
4

1 回答 1

2

你的while循环是错误的。Process32Next即使在调用函数之前,您也不应该检查错误值。Process32Next如果先前对 Windows API 函数(可能是另一个函数)的调用返回ERROR_NO_MORE_FILES,并且快照中第一个进程的名称恰好不是您要搜索的名称,则您的函数将不做任何事情而返回。

请记住,并非所有 API 函数都将错误代码设置为ERROR_SUCCESS即使它们已成功(也不要忘记在完成后关闭快照句柄)。

于 2013-04-18T16:04:41.007 回答