2

以下代码

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 *”参数与类型参数“LPWSTR”不兼容

(从意大利语翻译,我有意大利语的 vs,希望你理解)并且不能在 2 参数中将 Char 转换为 LPWSTR

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

4

2 回答 2

3

因为GetModuleFileName是一个宏定义,GetModuleFileNameW如果定义了 UNICODE 并且需要wchar_t*. 如果未定义 UNICODE,则GetModuleFileName解析为GetModuleFileNameA. 对您来说简单的解决方法是明确使用GetModuleFileNameA接受char*

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

很可能是因为使用 code::blocks 编译时没有定义 UNICODE,而在 VS 下默认定义了 UNICODE。

如果您不使用 UNICODE,并且希望保留多字节字符串(与 code::blocks 中相同),您可以通过将 General 选项卡上的项目属性更改为 来禁用 Visual Studio 构建中的Character setUNICODE Use Multi-Byte Character Set

[编辑]

为避免路径中的 UNICODE 字符出现问题,建议使用 UNICODE。这需要你使用std::wstringwhich is specialization for wchar_t,而不是char buffer[MAX_PATH];你应该使用wchar_t buffer[MAX_PATH];. cout << "reading path\n";必须是wcout << L"reading path\n";。您还可以使用TCHARor之类的宏_T("reading path"),使其独立地适用于 UNICODE 和非 UNICODE 构建。

于 2016-03-31T18:53:00.287 回答
0

我相信这是相关的我如何将 wchar_t 值打印到控制台?. 您还必须为字符串添加前缀,L以使它们像这样宽字符

std::wcout << L"reading path" << std::endl;

如果您的应用程序仅适用于 Windows,这将很有效,但您应该使用TEXT("reading path")宏样式否则,因为即使默认情况下其他平台不存在,您也可以轻松添加它。

于 2016-03-31T19:01:09.260 回答