2015-03-09 3 views
5

Я получаю ошибку компиляции в строке «сопзЬ wchar_t *» до «LPCTSTR» в MFC/C++:Невозможно преобразовать параметр 1 из проекта

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")); 

Я использую параметр «Использовать Multi-Byte Character Set», и я не хочу, чтобы изменить его.

+0

Я не уверен, почему 'getAllExceptionStr' возвращает большую строку, если вы застряли с ANSI, но тогда вам придется * конвертировать * (примечание: не делать). – chris

ответ

5

Самый простой способ - просто использовать MessageBoxW вместо MessageBox.

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

Второй самый простой способ - создать новую CString из оригинала; он будет автоматически конвертировать в/из широкой строки и строки MBCS по мере необходимости.

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

Я думаю, что если целью преобразования является просто передать строку как временную некоторую функцию/метод, например 'MessageBox()' в приведенном выше случае, использование 'CW2T' для преобразования более эффективно, чем создание новой' CString 'экземпляр. 'CString' имеет больше возможностей, чем' CW2T', но также ** больше накладных расходов **. Более того, 'CW2T' и другие помощники преобразования ATL также реализуют оптимизацию для« малых »строк с выделенным _stack buffer_ для небольших строк вместо выделения памяти из кучи. –

+0

@ Mr.C64 Я уверен, что вы правы, но я думаю, что беспокоиться о накладных расходах при вызове MessageBox может быть ребенком плаката для * преждевременной оптимизации *. –

+0

Каждый может свободно писать код, который ему нравится.Я предпочитаю использовать вышеупомянутые помощники, когда есть строки, которые нужно преобразовать как параметры в функции/методы (включая MessageBox): для меня это более качественный код, чем использование CString в этом контексте. У каждого свой стиль программирования. Я думаю, что лучше использовать высококачественный стиль независимо, если вы вызываете foo(), bar() или MessageBox(). –

0

Если вы хотите скомпилировать в режиме устаревшие MBCS, вы можете использовать ATL/MFC string conversion helpers, как CW2T, например:

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

кажется, что ваш метод getAllExceptionStr() возвращает std::wstring, поэтому при вызове .c_str() он возвращает const wchar_t*.

CW2T преобразует wchar_t -string в TCHAR -string, что в вашем случае (с учетом режима MBCS компиляции), эквивалентно char -string.

Обратите внимание, что конверсии из Unicode (wchar_t -strings) в MBCS (char -strings) могут быть потерями.

1

LPCSTR = const char*. Вы передаете ему const wchar*, что явно не то же самое.

Всегда проверяйте, что вы передаете API функции правильные параметры. _T("") Тип C-строки - это широкие строки и не могут использоваться с этой версией MessageBox().

1

Как e.getAllExceptionStr().c_str() возвращает строку широких, то следующий будет работать:

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

Обратите внимание на W на конце MessageBoxW;

Смежные вопросы