此函数应返回正确的进程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;
}
答案 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,以使所有内容分开,更易于阅读和调试,这更有意义。