进程ID函数获取错误“ERROR_NO_MORE_FILES”

时间:2013-04-18 15:45:18

标签: c++ winapi

我试图使用下面的函数从进程中获取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;
        }
}

1 个答案:

答案 0 :(得分:2)

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

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