GetProcessId无法找到指定进程,返回错误码24问题求助
问题原因
Windows系统错误码24对应ERROR_BAD_LENGTH,说明Process32First函数接收到的PROCESSENTRY32结构体的dwSize参数不符合系统要求,这是导致进程枚举直接失败、跳过循环的核心原因。
修复方案
按优先级依次检查修改以下内容:
- 确认头文件包含完整
必须在代码顶部包含这两个头文件,缺少<tlhelp32.h>会导致PROCESSENTRY32结构定义不完整,计算出的sizeof大小错误:#include <windows.h> #include <tlhelp32.h> #include <iostream> #include <tchar.h> - 补充API返回值判断逻辑
你当前未判断快照创建是否成功,哪怕GetLastError返回0也要校验返回句柄合法性,避免无效句柄传入后续API。 - 可选:替换为明确的宽字符版本API,避免TCHAR宏的兼容性问题
从你使用std::wcout可以判断项目使用Unicode字符集,直接使用宽字符版本接口可以消除宏带来的隐藏问题。
修改后的完整代码
#include <windows.h> #include <tlhelp32.h> #include <iostream> #include <tchar.h> DWORD GetProcessId(LPCWSTR ProcessName) { PROCESSENTRY32W pt; HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hsnap == INVALID_HANDLE_VALUE) { std::wcout << "Create snapshot failed, error: " << GetLastError() << std::endl; return 0; } pt.dwSize = sizeof(PROCESSENTRY32W); if (Process32FirstW(hsnap, &pt)) { do { if (!lstrcmpiW(pt.szExeFile, ProcessName)) { CloseHandle(hsnap); return pt.th32ProcessID; } } while (Process32NextW(hsnap, &pt)); } std::wcout << "Enum process failed, error: " << GetLastError() << std::endl; CloseHandle(hsnap); return 0; } int wmain(int argc, wchar_t* argv[]) { DWORD processId = GetProcessId(L"notepad.exe"); std::wcout << "processId: " << processId << std::endl; return 0; }
额外注意事项
如果修改后还是报错24,检查你的VS项目配置:
- 项目属性 -> C/C++ -> 代码生成 -> 结构成员对齐,确认设置为
默认,不要手动设置为1、2等小对齐值 - 检查代码中是否有全局的
#pragma pack修改对齐规则,如果有,需要在包含Windows头文件前用#pragma pack(push, 8)恢复默认对齐,包含后再#pragma pack(pop)恢复自定义设置
内容的提问来源于stack exchange,提问作者user16839617
相关产品推荐
相关产品推荐

