无法在 MFC/C++ 项目中将参数 1 从 'const wchar_t *' 转换为 'LPCTSTR'

Cannot convert parameter 1 from 'const wchar_t *' to 'LPCTSTR' in MFC / C++ project

我在行上得到一个编译错误:

 MessageBox(e.getAllExceptionStr().c_str(), _T("Error initializing the sound player"));

Error   4   error C2664: 'CWnd::MessageBoxA' : cannot convert parameter 1 from 'const wchar_t *' to 'LPCTSTR'   c:\users\daniel\documents\visual studio 2012\projects\mytest1\mytest1\main1.cpp 141 1   MyTest1

我不知道如何解决这个错误,我尝试了以下方法:

MessageBox((wchar_t *)(e.getAllExceptionStr().c_str()), _T("Error initializing the sound player"));
MessageBox(_T(e.getAllExceptionStr().c_str()), _T("Error initializing the sound player"));

我正在使用设置 "Use Multi-Byte Character Set",我不想更改它。

最简单的方法就是使用 MessageBoxW 而不是 MessageBox

MessageBoxW(e.getAllExceptionStr().c_str(), L"Error initializing the sound player");

第二个最简单的方法是从原来的 CString 创建一个新的;它会根据需要自动转换 to/from 宽字符串和 MBCS 字符串。

CString msg = e.getAllExceptionStr().c_str();
MessageBox(msg, _T("Error initializing the sound player"));

如果你想在过时的MBCS模式下编译,你可能想使用ATL/MFC string conversion helpers,比如CW2T,例如:

MessageBox(
    CW2T(e.getAllExceptionStr().c_str()),
    _T("Error initializing the sound player")
);

看来你的getAllExceptionStr()方法returns一个std::wstring,所以在上面调用.c_str()returns一个const wchar_t*

CW2Twchar_t-string 转换为 TCHAR-string,在您的情况下(考虑 MBCS 编译模式)相当于 char-string .

但是请注意,从 Unicode(wchar_t-字符串)到 MBCS(char-字符串)的转换可能是有损的。

LPCSTR = const char*。您传递给它 const wchar*,这显然不是一回事。

始终检查您传递给 API 函数的参数是否正确。 _T("") 类型的 C 字符串是宽字符串,不能用于该版本的 MessageBox()

由于 e.getAllExceptionStr().c_str() 正在返回宽字符串,因此以下将起作用:

MessageBoxW(e.getAllExceptionStr().c_str(), L"Error initializing the sound player");

注意MessageBoxW末尾的W