2015-03-09 5 views
5

ottengo un errore di compilazione sulla linea:Impossibile convertire il parametro 1 da 'const wchar_t *' a 'LPCTSTR' in MFC/C++ progetto

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 

non so come risolvere questo errore, ho provato quanto segue:

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

sto usando l'impostazione "Character Set Usa Multi-Byte" e io non voglio cambiarlo.

+0

Non sono sicuro del perché 'getAllExceptionStr' restituisca una stringa ampia se si è bloccati con ANSI, ma poi si dovrà * convertire * (nota: non eseguire il cast). – chris

risposta

5

Il modo più semplice è semplicemente utilizzare MessageBoxW anziché MessageBox.

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

Il secondo modo più semplice è creare un nuovo CString dall'originale; convertirà automaticamente in/da stringa wide e stringa MBCS, se necessario.

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

Penso che se lo scopo della conversione è passare semplicemente la stringa come temporanea ad una funzione/metodo come 'MessageBox()' nel caso precedente, usare 'CW2T' per la conversione è più efficiente della creazione di un nuovo' CString 'istanza. 'CString' ha più funzioni di' CW2T', ma anche ** altro overhead **. Inoltre, 'CW2T' e gli altri helper di conversione ATL implementano anche un'ottimizzazione per stringhe" piccole ", con un buffer_ allocato _stack per stringhe di piccole dimensioni, invece di allocare memoria dall'heap. –

+0

@ Mr.C64 Sono sicuro che hai ragione, ma penso che preoccuparsi del sovraccarico in una chiamata a MessageBox potrebbe essere il poster per l'ottimizzazione * prematura *. –

+0

Ognuno è libero di scrivere il codice che gli piace. –

0

Se vuoi compilare in modalità MBCS obsoleti, si consiglia di utilizzare il ATL/MFC string conversion helpers, come CW2T, ad esempio:

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

Sembra che il metodo getAllExceptionStr() restituisce un std::wstring, quindi chiamare .c_str() su di esso restituisce un const wchar_t*.

CW2T converte da wchar_t -string a TCHAR -string, che nel tuo caso (considerando la modalità di compilazione MBCS), è equivalente a char -string.

Si noti tuttavia che le conversioni da Unicode (wchar_t -strings) a MBCS (char -strings) possono essere perdite.

1

LPCSTR = const char*. Lo stai passando a const wchar*, che chiaramente non è la stessa cosa.

Controllare sempre che si passino le funzioni API con i parametri corretti. _T("") tipo C-string sono stringhe larghe e non possono essere utilizzati con quella versione di MessageBox().

1

Come e.getAllExceptionStr().c_str() sta tornando vasta stringa allora quanto segue funzionerà:

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

Annotare il W sulla fine della MessageBoxW;