GetProcessId 没有找到任何进程
GetProcessId doesn't find any process
我正在使用以下代码尝试获取 notepad.exe
的 PID,但找不到进程。
我目前 运行 在 Windows 10 上使用 VS Studio 19 作为版本 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()
returns 24 在这一行。
您发布的调试输出图像 window 显示 pt.dwSize
设置为 2168
。这看起来不对。 pt.dwSize
很重要,它被 Windows 用于版本控制。
在我的电脑上sizeof(PROCESSENTRY32)
是556
(这取决于Windows版本,我使用的是Windows 10)。如果项目不是 Unicode,大小应该大约是它的一半。在 VS 中,您可以右键单击 PROCESSENTRY32
,它会将您带到这个定义:
typedef struct tagPROCESSENTRY32W
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID; // this process
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; // associated exe
DWORD cntThreads;
DWORD th32ParentProcessID; // this process's parent process
LONG pcPriClassBase; // Base priority of process's threads
DWORD dwFlags;
WCHAR szExeFile[MAX_PATH]; // Path
} PROCESSENTRY32W;
MAX_PATH
应该是 260
。我的猜测是您重新定义了 MAX_PATH
或者您在某处放置了错误的 #pragma
语句。或者有什么奇怪的事情发生了。尝试重新启动 Windows(使用重新启动而不是 shutdown/start)
此外,使用 PROCESSENTRY32 pt = {0}
将内存归零
PROCESSENTRY32 pt = { 0 };
pt.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hsnap, &pt))
{
DWORD err = GetLastError();
std::cout << "Process32First failed\n";
std::cout << pt.dwSize << " GetLastError : " << err << "\n";
CloseHandle(hsnap);
return DWORD(-1);
}
唯一预期的 GetLastError
是 ERROR_NO_MORE_FILES
,如 Windows 文档中所示。如果错误是其他原因,则表示该功能已完全失败。
如果您的项目是 Unicode,考虑避免那些 T
宏。只需使用 GetProcessId(L"notepad.exe");
和 LPCWSTR
等
Ps,我 运行 你的代码在我的电脑上没问题。唯一的区别是 sizeof(PROCESSENTRY32)
我正在使用以下代码尝试获取 notepad.exe
的 PID,但找不到进程。
我目前 运行 在 Windows 10 上使用 VS Studio 19 作为版本 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()
returns 24 在这一行。
您发布的调试输出图像 window 显示 pt.dwSize
设置为 2168
。这看起来不对。 pt.dwSize
很重要,它被 Windows 用于版本控制。
在我的电脑上sizeof(PROCESSENTRY32)
是556
(这取决于Windows版本,我使用的是Windows 10)。如果项目不是 Unicode,大小应该大约是它的一半。在 VS 中,您可以右键单击 PROCESSENTRY32
,它会将您带到这个定义:
typedef struct tagPROCESSENTRY32W
{
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID; // this process
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID; // associated exe
DWORD cntThreads;
DWORD th32ParentProcessID; // this process's parent process
LONG pcPriClassBase; // Base priority of process's threads
DWORD dwFlags;
WCHAR szExeFile[MAX_PATH]; // Path
} PROCESSENTRY32W;
MAX_PATH
应该是 260
。我的猜测是您重新定义了 MAX_PATH
或者您在某处放置了错误的 #pragma
语句。或者有什么奇怪的事情发生了。尝试重新启动 Windows(使用重新启动而不是 shutdown/start)
此外,使用 PROCESSENTRY32 pt = {0}
PROCESSENTRY32 pt = { 0 };
pt.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hsnap, &pt))
{
DWORD err = GetLastError();
std::cout << "Process32First failed\n";
std::cout << pt.dwSize << " GetLastError : " << err << "\n";
CloseHandle(hsnap);
return DWORD(-1);
}
唯一预期的 GetLastError
是 ERROR_NO_MORE_FILES
,如 Windows 文档中所示。如果错误是其他原因,则表示该功能已完全失败。
如果您的项目是 Unicode,考虑避免那些 T
宏。只需使用 GetProcessId(L"notepad.exe");
和 LPCWSTR
等
Ps,我 运行 你的代码在我的电脑上没问题。唯一的区别是 sizeof(PROCESSENTRY32)