无法将 Char 转换为 LPWSTR
Can't convert Char to 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(缓冲区)的第二个参数处给我错误:
the type "char *" argument is incompatible with the type parameter
"LPWSTR"
(翻译自意大利语,我有意大利语的vs,希望你能理解)
和
无法在 2 参数中将 Char 转换为 LPWSTR
此代码在 code::blocks 和 dev c++ 中编译良好,但在 vs 中却不行
因为GetModuleFileName
是GetModuleFileNameW
的宏定义,如果定义了UNICODE,需要wchar_t*
。如果未定义 UNICODE,则 GetModuleFileName
解析为 GetModuleFileNameA
。简单的解决方法是显式使用 GetModuleFileNameA
接受 char*
This code compiles fine with code::blocks and dev c++ but in vs it doesn't
很可能是因为使用 code::blocks 编译时未定义 UNICODE,而在 VS 下默认定义了 UNICODE。
如果您不使用 UNICODE,并且想继续使用多字节字符串(与 code::blocks 中相同),您可以通过在“常规”选项卡上更改项目属性来禁用 Visual Studio 构建中的 UNICODE - > Character set
到 Use Multi-Byte Character Set
.
[编辑]
为避免路径中的 UNICODE 字符出现问题,建议使用 UNICODE。这要求您使用 std::wstring
,它是 wchar_t
的特化,而且您应该使用 wchar_t buffer[MAX_PATH];
而不是 char buffer[MAX_PATH];
。 cout << "reading path\n";
必须是 wcout << L"reading path\n";
。您还可以使用 TCHAR
或 _T("reading path")
之类的宏,使其独立适用于 UNICODE 和非 UNICODE 版本。
我认为这与 How I can print the wchar_t values to console? 相关。您还必须在字符串前加上 L
以使其成为这样的宽字符
std::wcout << L"reading path" << std::endl;
如果您的应用程序仅适用于 Windows,这会很好地工作,但您应该使用 TEXT("reading path")
宏样式,因为即使其他平台默认不存在,您可以添加很容易。
下面的代码
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(缓冲区)的第二个参数处给我错误:
the type "char *" argument is incompatible with the type parameter "LPWSTR"
(翻译自意大利语,我有意大利语的vs,希望你能理解) 和 无法在 2 参数中将 Char 转换为 LPWSTR
此代码在 code::blocks 和 dev c++ 中编译良好,但在 vs 中却不行
因为GetModuleFileName
是GetModuleFileNameW
的宏定义,如果定义了UNICODE,需要wchar_t*
。如果未定义 UNICODE,则 GetModuleFileName
解析为 GetModuleFileNameA
。简单的解决方法是显式使用 GetModuleFileNameA
接受 char*
This code compiles fine with code::blocks and dev c++ but in vs it doesn't
很可能是因为使用 code::blocks 编译时未定义 UNICODE,而在 VS 下默认定义了 UNICODE。
如果您不使用 UNICODE,并且想继续使用多字节字符串(与 code::blocks 中相同),您可以通过在“常规”选项卡上更改项目属性来禁用 Visual Studio 构建中的 UNICODE - > Character set
到 Use Multi-Byte Character Set
.
[编辑]
为避免路径中的 UNICODE 字符出现问题,建议使用 UNICODE。这要求您使用 std::wstring
,它是 wchar_t
的特化,而且您应该使用 wchar_t buffer[MAX_PATH];
而不是 char buffer[MAX_PATH];
。 cout << "reading path\n";
必须是 wcout << L"reading path\n";
。您还可以使用 TCHAR
或 _T("reading path")
之类的宏,使其独立适用于 UNICODE 和非 UNICODE 版本。
我认为这与 How I can print the wchar_t values to console? 相关。您还必须在字符串前加上 L
以使其成为这样的宽字符
std::wcout << L"reading path" << std::endl;
如果您的应用程序仅适用于 Windows,这会很好地工作,但您应该使用 TEXT("reading path")
宏样式,因为即使其他平台默认不存在,您可以添加很容易。