You need to enable JavaScript to run this app. CSGO代码编译报错WCHAR*与const char*参数类型不兼容如何解决
优惠活动
大模型
产品
解决方案
定价
更多

CSGO代码编译报错WCHAR*与const char*参数类型不兼容如何解决

错误原因

你的项目默认启用了Unicode字符集,Windows API的MODULEENTRY32结构体的szModule成员实际是WCHAR*(宽字符串类型),而你用了仅支持窄字符串const char*的strcmp函数做对比,因此出现类型不兼容报错。

修复方案

你可以任选以下任意一种方案解决:

  • 方案1:统一使用宽字符版本逻辑
    将函数参数修改为宽字符类型,同时替换字符串对比函数为宽字符版本:

    // 修改函数参数为const wchar_t*
    uintptr_t GetModuleBaseAddress(const wchar_t* modName) {
        HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
        if (hSnap != INVALID_HANDLE_VALUE) {
            MODULEENTRY32 modEntry;
            modEntry.dwSize = sizeof(modEntry);
            if (Module32First(hSnap, &modEntry)) {
                do {
                    // 用wcscmp替代strcmp做宽字符串对比
                    if (!wcscmp(modEntry.szModule, modName)) {
                        CloseHandle(hSnap);
                        return (uintptr_t)modEntry.modBaseAddr;
                    }
                } while (Module32Next(hSnap, &modEntry));
            }
            CloseHandle(hSnap);
        }
        // 补充未找到模块时的返回值,避免未定义行为
        return 0;
    }
    

    后续调用该函数传参时,需要给字符串增加L前缀标记为宽字符,例如GetModuleBaseAddress(L"client.dll")。

  • 方案2:显式使用窄字符版本的Windows API
    如果你不想改现有字符串传参逻辑,可以直接调用ANSI版本的模块枚举API,对应的结构体成员会自动变为窄字符类型:

    uintptr_t GetModuleBaseAddress(const char* modName) {
        HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
        if (hSnap != INVALID_HANDLE_VALUE) {
            // 用MODULEENTRY32A替代默认的MODULEENTRY32
            MODULEENTRY32A modEntry;
            modEntry.dwSize = sizeof(modEntry);
            // 用Module32FirstA替代Module32First
            if (Module32FirstA(hSnap, &modEntry)) {
                do {
                    if (!strcmp(modEntry.szModule, modName)) {
                        CloseHandle(hSnap);
                        return (uintptr_t)modEntry.modBaseAddr;
                    }
                // 用Module32NextA替代Module32Next
                } while (Module32NextA(hSnap, &modEntry));
            }
            CloseHandle(hSnap);
        }
        return 0;
    }
    

额外提醒:原代码存在未关闭快照句柄、未找到模块时无返回值的问题,上述修复代码已经同步补上了这两处漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 00:45:11