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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:50:32