2009-03-20 4 views
6

Ich versuche, eine (sehr) einfache Win32 GUI-Programm zu erstellen, aber aus irgendeinem Grund der Compiler (ich bin mit VC++ 2008 Express) will, dass ich manuell jeden String oder char * zu LPCWSTR typisieren zu:Umwandlung in LPCWSTR?

I bekomme ich diesen Compiler Fehler jedes Mal, wenn ich dies tue, bekomme ich diesen Fehler für die "Hallo" und "Hinweis":

Fehler C2664: 'MessageBoxW': kann Parameter 2 von 'const char [22]' nicht zu konvertieren ‚LPCWSTR‘

Bitte sagen Sie mir, ich muss jedes Mal, wenn ich dies nicht tun, werfen ....

Hier ist der Code:

#include <windows.h> 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, "Hello", "Note", MB_OK); 
    return 0; 
} 
+1

oder einfach MessageBoxA aufrufen (NULL, "Hello", "Note", MB_OK); – deemok

Antwort

14

Der Standard für neue Projekte in VS2008 ist die Erstellung von UNICODE-fähigen Anwendungen. Sie können entweder den Standard ändern und zu verwenden ANSI oder MBCS-Apps gehen zurück (Eigenschaften-> Konfiguration Eigenschaften-> Allgemein-> Zeichensatz), oder verwenden Sie Unicode-Strings wie folgt aus:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow) 
{ 
    MessageBox(NULL, L"Hello", L"Note", MB_OK); 
    return 0; 
} 

Sie nicht werfen Sie Ihre Strings zu LPCWSTR, weil das zu undefiniertem Verhalten führt! Ein Char ist nicht dasselbe wie ein wchar_t!

1

Das Problem ist, dass Sie für UNICODE erstellen und Nicht-Unicode-Zeichenfolgen übergeben.

Versuchen:

MessageBox(NULL, L"Hello", L"Note", MB_OK); 

oder Build einrichten für ANSI/MBCS oder schauen Sie in die Verwendung TCHARs (das ist ein Schmerz sind).

1

Meine Erinnerungen an Win32 C-Programmierung sind trüb, aber wie ich mich erinnere, müssen Sie durch Umwickeln Ihre Stringliterale in diesem Makro starten:

_T („mystring“)

Wenn Sie Unicode bauen, Dies wird in eine Unicode-Zeichenfolge konvertiert.

Wenn Sie nur Unicode erstellen oder sicher sind, dass Sie nur eine bestimmte Zeichenfolge in Unicode behandeln, können Sie den L "" -Marker verwenden, was das _T-Makro unter den Covern macht.

Möglicherweise müssen Sie den Header tchar.h einfügen.

Wenn ich Win32-Programmierung mache, deklariere ich normalerweise Zeichenfolgen als TCHAR * szWas auch immer, so dass die Dinge auf Win9x fast genauso gut funktionieren wie NT/Win2k/XP. (Es gibt auch andere Bequemlichkeitsmakros wie LPTSTR und so weiter, und MFC enthält einige einfache Konvertierungsmakros für die Fälle, in denen Sie zwischen ansi und Unicode konvertieren müssen, um spezifische APIs aufzurufen).

0

Wie andere Beiträge sagten, erstellen Sie eine Unicode-Anwendung. Sie können zu und von Unicode-Projekt in Projekteinstellungen wechseln (vergessen Sie nicht, es für beide "Debug" und "Release" -Konfigurationen festzulegen.

Wenn Sie es verwenden möchten, müssen Sie alle Ihre statische Strings mit L vorangestellt haben:

L"Some static string" 

Für char [] Strings gibt es ein Verfahren mbstowcs_s, was in etwa wie folgt verwendet:

std::string str; // the string you want to convert 

WCHAR wstr[128]; 
size_t convertedChars = sizeof(wstr)/sizeof(WCHAR); 
mbstowcs_s(&convertedChars, wstr, str.c_str(), _TRUNCATE); 

So habe ich es in einem meiner Projekte benutzt. Zur genauen Verwendung siehe MSDN.