无法将 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 中却不行

因为GetModuleFileNameGetModuleFileNameW的宏定义,如果定义了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 setUse 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") 宏样式,因为即使其他平台默认不存在,您可以添加很容易。