C++编译错误:TCHAR数组无法转换为std::string的解决求助
错误原因分析
这个编译错误的核心是TCHAR和std::string的字符类型不匹配:
- 当项目启用Unicode字符集时,
TCHAR会被定义为wchar_t(宽字符),而std::string是基于char(单字节字符)的字符串类型,两者没有直接隐式转换,因此编译器报错。 - 之前代码能正常运行,大概率是因为当时项目使用多字节字符集,此时
TCHAR等价于char,可以直接赋值给std::string。
解决方法
方法1:改用宽字符串类型(推荐,符合现代Windows编程规范)
把std::string替换为std::wstring,同时确保用来对比的name也是宽字符串类型:
inline uint64_t GetModuleBaseAddr() { HMODULE h_modules[1024]; DWORD pcb_needed; handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if (K32EnumProcessModules(handle, h_modules, sizeof(h_modules), &pcb_needed)) { for (unsigned int i = 0; i < (pcb_needed / sizeof(HMODULE)); i++) { TCHAR module_name[MAX_PATH]; if (GetModuleFileNameEx(handle, h_modules[i], module_name, sizeof(module_name) / sizeof(TCHAR))) { std::wstring str_module_name = module_name; // 改用std::wstring if (str_module_name.find(name) != std::wstring::npos) // name需为std::wstring或L"xxx"格式 { base = (uint64_t)h_modules[i]; return base; } } } } return 0; }
如果name是const char*类型,可通过std::wstring(name.begin(), name.end())或MultiByteToWideChar函数转换为宽字符串。
方法2:将宽字符转换为单字节字符(适合必须用std::string的场景)
若要保留std::string,可使用WideCharToMultiByte函数把TCHAR数组(此时为wchar_t数组)转换成char数组:
inline uint64_t GetModuleBaseAddr() { HMODULE h_modules[1024]; DWORD pcb_needed; handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if (K32EnumProcessModules(handle, h_modules, sizeof(h_modules), &pcb_needed)) { for (unsigned int i = 0; i < (pcb_needed / sizeof(HMODULE)); i++) { TCHAR module_name[MAX_PATH]; if (GetModuleFileNameEx(handle, h_modules[i], module_name, sizeof(module_name) / sizeof(TCHAR))) { char char_module_name[MAX_PATH]; WideCharToMultiByte(CP_ACP, 0, module_name, -1, char_module_name, MAX_PATH, NULL, NULL); std::string str_module_name = char_module_name; if (str_module_name.find(name) != std::string::npos) { base = (uint64_t)h_modules[i]; return base; } } } } return 0; }
注意:这种方法遇到非ASCII字符时可能出现乱码,因为单字节字符集无法完整表示所有Unicode字符。
方法3:强制切换到多字节字符集(不推荐)
在项目设置中,将字符集选项从“使用Unicode字符集”改为“使用多字节字符集”。
该方法虽能快速解决问题,但不符合现代Windows应用开发趋势,会限制程序对Unicode字符的支持。
内容的提问来源于stack exchange,提问作者Jeotique
相关产品推荐
相关产品推荐

