2015-03-09 8 views
5

ich einen Kompilierungsfehler auf der Linie:Kann nicht Parameter 1 von ‚const wchar_t *‘ auf ‚LPCTSTR‘ in MFC/C konvertieren ++ Projekt

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 

Ich weiß nicht, wie man diese Fehler zu beheben, ich die versucht, folgende:

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

ich die Einstellung bin mit „Use Multi-Byte Character Set“ und ich will nicht, es zu ändern.

+0

Ich bin nicht sicher, warum 'getAllExceptionStr' eine breite Zeichenfolge zurückgibt, wenn Sie mit ANSI stecken, aber dann müssen Sie * konvertieren * (Hinweis: nicht umgewandelt) es. – chris

Antwort

5

Der einfachste Weg ist einfach MessageBoxW anstelle von MessageBox zu verwenden.

Der zweite einfachste Weg ist, einen neuen CString aus dem Original zu erstellen; Es wird automatisch nach/von Wide-String und MBCS-String nach Bedarf konvertiert.

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

Ich denke, wenn der Zweck der Umwandlung ist, übergeben Sie einfach die Zeichenfolge als temporary zu einer Funktion/Methode wie "MessageBox()" in dem obigen Fall, mit 'CW2T' für die Konvertierung ist effizienter als das Erstellen eines neuen' CString 'Beispiel. 'CString' hat mehr Funktionen als' CW2T', aber auch ** Overhead **. Darüber hinaus implementieren "CW2T" und die anderen ATL-Konvertierungshelfer auch eine Optimierung für "kleine" Strings mit einem _stack-allocated buffer_ für kleine Strings, anstatt Speicher vom Heap zuzuweisen. –

+0

@ Mr.C64 Ich bin sicher, dass Sie Recht haben, aber ich denke, Sorgen über Overhead in einem Anruf an MessageBox könnte das Aushängeschild für * vorzeitige Optimierung * sein. –

+0

Jeder ist frei, den Code zu schreiben, den er mag.Ich bevorzuge die Verwendung der oben genannten Helfer, wenn Zeichenfolgen als Parameter für Funktionen/Methoden (einschließlich MessageBox) konvertiert werden sollen: Für mich ist das Code höherer Qualität als CString in diesem Kontext. Jeder hat seinen eigenen Programmierstil. Ich denke, es ist besser, qualitativ hochwertigen Stil unabhängig zu verwenden, wenn Sie foo(), bar() oder MessageBox() aufrufen. –

0

Wenn Sie in die veraltete MBCS-Modus zu erstellen, können Sie die ATL/MFC string conversion helpers, wie CW2T, zum Beispiel verwenden möchten:

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

Es scheint, dass Ihr getAllExceptionStr() Methode ein std::wstring zurückgibt, so ruft .c_str() darauf zurück const wchar_t*.

CW2T von wchar_t umwandelt TCHAR -string -string, das im Fall (der MBCS Kompilierungsmodus Berücksichtigung) entspricht char -string.

Beachten Sie jedoch, dass Konvertierungen von Unicode (wchar_t - Strings) zu MBCS (char - Strings) verlustbehaftet sein können.

1

LPCSTR = const char*. Sie übergeben es eine const wchar*, die eindeutig nicht das Gleiche ist.

Überprüfen Sie immer, dass Sie den API-Funktionen die richtigen Parameter übergeben. _T("") Typ C-String sind breite Strings und können nicht mit dieser Version von MessageBox() verwendet werden.

1

Als e.getAllExceptionStr().c_str() kehrt breite Zeichenfolge dann funktioniert das folgende:

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

Notiere die W am Ende MessageBoxW;