GetProcessId返回Parrent,而不是需要的

时间:2018-07-23 19:54:49

标签: c++ winapi

此函数应返回正确的进程ID。 但是,如果进程具有父进程-它返回其父进程的进程ID。 为什么?如何解决?

DWORD _getProcId(LPCSTR processName)
{
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)

        {
            if (_stricmp(entry.szExeFile, processName) == 0)
            {
                HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, false, entry.th32ProcessID);
                if (h)
                {
                    return GetProcessId(h);
                }
                else
                {
                    CloseHandle(snapshot);
                    return 0;
                }
            }
        }
    }

    CloseHandle(snapshot);
    return 0;
}

1 个答案:

答案 0 :(得分:2)

您的“获取进程ID”函数将返回具有匹配的可执行文件名的第一个进程。这就是为什么它返回父进程的原因,因为它是第一个匹配字符串比较的进程。如果您有两个同名的运行进程,则会发生这种情况。您对此无能为力。

这里还有一些更好的代码(使用unicode)

DWORD GetProcId(const wchar_t* targetProcess)
{
    DWORD procId = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 procEntry;
        procEntry.dwSize = sizeof(procEntry);
        if (Process32First(hSnap, &procEntry))
        {
            do
            {
                if (!wcscmp(procEntry.szExeFile, targetProcess))
                {
                    procId = procEntry.th32ProcessID;
                    break;
                }
            } while (Process32Next(hSnap, &procEntry));
        }
    }
    CloseHandle(hSnap);
    return procId;
}

这是MSDN上的文档,其中包含更多详细信息https://docs.microsoft.com/en-us/windows/desktop/ToolHelp/taking-a-snapshot-and-viewing-processes

先调用此GetProcId()函数,然后再调用OpenProcess后记IMO,以使所有内容分开,更易于阅读和调试,这更有意义。