无法在 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*
。
CW2T
从 wchar_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
;
我在行上得到一个编译错误:
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*
。
CW2T
从 wchar_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
;