C++调用GetModuleFileName报char*与LPWSTR类型不兼容错误
错误原因
Windows 绝大多数涉及字符串处理的系统API都提供两套独立实现:
- 后缀为
A的ANSI版本:接收char*类型参数,采用系统当前代码页编码 - 后缀为
W的宽字符版本:接收wchar_t*(即LPWSTR)类型参数,采用UTF-16编码,是Windows原生运行的版本
你代码中写的GetModuleFileName是头文件中定义的宏,并非真实函数:VS新建C++项目时默认将字符集设置为使用Unicode字符集,此时该宏会被自动展开为GetModuleFileNameW,要求传入的缓冲区类型为wchar_t*。但你定义的re是char数组,类型和参数要求不匹配,因此触发编译错误。
修复方案
方案1:使用Unicode版本API(官方推荐)
适配默认编译配置,无额外编码转换开销,可完美支持中文、特殊字符等非ASCII路径,不会出现乱码问题。修改后代码如下:
wchar_t re[MAX_PATH]; DWORD pathLen = GetModuleFileName(NULL, re, MAX_PATH); wstring FP(re, pathLen); // 若后续逻辑必须使用string类型,可额外做UTF-16到UTF-8的编码转换
方案2:显式调用ANSI版本API
如果你的业务逻辑必须使用char类型字符串,可以直接显式调用带A后缀的ANSI版API,无需修改项目配置:
char re[MAX_PATH]; DWORD pathLen = GetModuleFileNameA(NULL, re, MAX_PATH); string FP(re, pathLen);
该方案不推荐长期使用,ANSI版本API遇到系统当前代码页不支持的字符时,会出现路径识别失败、乱码等问题。
你也可以通过修改项目配置(右键项目 → 属性 → 配置属性 → 高级 → 字符集,选择「使用多字节字符集」)让GetModuleFileName宏默认展开为ANSI版本,原有代码无需改动即可编译,但该方式同样存在编码兼容隐患,不建议使用。
内容的提问来源于stack exchange,提问作者sky3889 kriper
相关产品推荐
相关产品推荐

