You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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项目配置:

  1. 项目属性 -> C/C++ -> 代码生成 -> 结构成员对齐,确认设置为默认,不要手动设置为1、2等小对齐值
  2. 检查代码中是否有全局的#pragma pack修改对齐规则,如果有,需要在包含Windows头文件前用#pragma pack(push, 8)恢复默认对齐,包含后再#pragma pack(pop)恢复自定义设置

内容的提问来源于stack exchange,提问作者user16839617

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:48:03