【发布时间】:2021-09-07 06:21:53
【问题描述】:
我正在使用下面的代码尝试获取notepad.exe的PID,但是找不到进程。
我目前在 Windows 10 上运行并使用 VS Studio 19 作为 Release x64 进行编译。
还尝试查找其他进程,如chrome.exe、calculator.exe等,但找不到任何东西。
DWORD GetProcessId(LPCTSTR ProcessName)
{
PROCESSENTRY32 pt;
HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
std::wcout << "Error: " << GetLastError() << std::endl; // Error: 0
pt.dwSize = sizeof(PROCESSENTRY32);
std::wcout << "Error: " << GetLastError() << std::endl; // Error: 0
if (Process32First(hsnap, &pt)) { // must call this first
do {
if (!lstrcmpi(pt.szExeFile, ProcessName)) {
CloseHandle(hsnap);
return pt.th32ProcessID;
}
} while (Process32Next(hsnap, &pt));
}
std::wcout << "Error: " << GetLastError() << std::endl; // Error: 24
CloseHandle(hsnap); // close handle on failure
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD processId;
processId = GetProcessId(TEXT("notepad.exe"));
std::wcout << "processId: " << processId << std::endl;
return 0;
}
调试时,我看到代码跳过do while,直接跳转到CloseHandle(hsnap)
GetLastError() 在这一行返回 24。
【问题讨论】:
-
CreateToolhelp32Snapshot 是否失败? Process32First 会失败吗?
-
@Anders 否,
GetLastError都返回 0。 -
GetLastError前需要检查返回值
-
@Anders 你是什么意思?
hsnap不是 NULL 并且 GetLasError 返回 0,Process32First失败,错误 24,我更新代码,看看。 -
std::wcout可以重置GetLastError(),所以你需要在API调用失败后立即调用GetLastError(),然后再任何其他系统调用。