【问题标题】:VS2017 C++ compiler error C2664 can not convert argumentVS2017 C++ 编译器错误 C2664 无法转换参数
【发布时间】:2018-09-25 15:08:06
【问题描述】:

使用 VS2017 我使用 unicode 字符集编译下面的代码

STDMETHODIMP Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt) {
 TCHAR *szExtension = PathFindExtension(lpwszFileName);

我收到以下错误

error C2664: 'LPSTR PathFindExtensionA(LPCSTR)': cannot convert argument 1 from 'LPCOLESTR' to 'LPCSTR'

VS2008下同样的代码编译就好了。这里似乎有什么问题以及为什么编译器选择 PathFindExtenstion 的 ANSI 版本而不是 unicode 版本?

【问题讨论】:

  • LPCOLESTR 始终是宽字符串 (UTF-16LE)。您不是为 Unicode 构建的,因此宏 PathFindExtension 被替换为 PathFindExtensionA,它需要一个窄字符串。 (a) 更改项目选项以编译为 Unicode(推荐); (b) 显式调用PathFindExtensionW,或 (c) 在调用前将宽字符串转换为窄字符串。
  • 我检查了两次项目设置中的字符代码调整为unicode。
  • 检查Configuration Properties > C/C++ > Command Line 这给出了正在使用的实际命令行。查找/D "_UNICODE" /D "UNICODE" 如果缺少其中一个或两个,则项目属性中的其他地方有问题。
  • @Richard 我一回到我的办公室就会去看看,我会告诉你的。谢谢
  • @Richard 你说得对。命令行中没有 _UNICODE 定义器。看看下面。 VS 中的哪些参数可以改变正常行为? /GS /analyze- /W3 /Zc:wchar_t /I"..\..\BaseClasses\" /I"D:\gnosis_v2.00u" /ZI /Gm /Od /Fd"Debug\vc141.pdb" /Zc :inline /D "WIN32" /D "_D​​EBUG" /D "_WINDOWS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gz /Oy- /MDd /FC /Fa"Debug\" /EHsc /nologo / Fo"Debug\" /Fp"Debug\Async.pch" /diagnostics:classic

标签: c++ string unicode compiler-errors c2664


【解决方案1】:

问题在于 VS2017 变量

%(预处理器定义)

预处理器定义中缺少

。现在定义器 /D _UNICODE/D UNICODE 已正确添加到编译器参数列表中。

【讨论】:

    猜你喜欢
    • 2011-12-22
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多