以下代码
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中它没有
答案 0 :(得分:3)
因为GetModuleFileName
是GetModuleFileNameW
的宏定义,如果定义了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 set
至Use 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;
宏样式,因为即使其他平台默认不存在,您也可以轻松添加它