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
相关产品推荐
相关产品推荐

