无法将Char转换为LPWSTR

时间:2016-03-31 18:49:57

标签: c++ char lpwstr

以下代码

string exePath() {
string path;
char buffer[MAX_PATH];
cout << "reading path\n";
GetModuleFileName(NULL, buffer, MAX_PATH);
string::size_type pos = string(buffer).find_last_of("\\/");
path = string(buffer).substr(0, pos)/*+"\\system.exe"*/;
return path;

}

在VisualStudio(缓冲区)的第二个参数中给出错误:

  

类型“char *”参数与type参数不兼容   “LPWSTR”

(翻译自意大利语,我有意大利语的vs,希望你理解) 和 无法在2参数

中将Char转换为LPWSTR

这段代码可以很好地编译代码:: blocks和dev c ++但是在vs中它没有

2 个答案:

答案 0 :(得分:3)

因为GetModuleFileNameGetModuleFileNameW的宏定义,如果定义了UNICODE且需要wchar_t*。如果未定义UNICODE,则GetModuleFileName会解析为GetModuleFileNameA。对您而言,最简单的解决方法是明确使用GetModuleFileNameA接受char*

  

这段代码可以很好地编译代码:: blocks和dev c ++但是在vs中它没有

最有可能的原因是,在没有定义UNICODE的情况下使用code :: blocks进行编译,而默认情况下在VS下定义了UNICODE。

如果您没有使用UNICODE,并希望保留多字节字符串(与code :: blocks中相同),则可以通过更改常规选项卡上的项目属性来禁用Visual Studio构建中的UNICODE - &gt; Character setUse Multi-Byte Character Set

[edit]

为避免路径中出现UNICODE字符问题,建议使用UNICODE。这要求您使用std::wstring专门化的wchar_t,而不是char buffer[MAX_PATH];,您应该使用wchar_t buffer[MAX_PATH];cout << "reading path\n";必须是wcout << L"reading path\n";。您还可以使用TCHAR_T("reading path")等宏来使其独立地用于UNICODE和非UNICODE构建。

答案 1 :(得分:0)

我认为这与How I can print the wchar_t values to console?有关。您还必须在字符串前加<div id=nwPlayContainer> <div id="albumArt"></div> <div id="trackArtist"></div> <div id="trackTitle"></div> </div>,以使它们像这样使用宽字符

L

如果您的应用程序仅适用于Windows,这将很有效,但您应该使用std::wcout << L"reading path" << std::endl; 宏样式,因为即使其他平台默认不存在,您也可以轻松添加它