const char in LPCWSTR konvertieren?!



  • Hallo zusammen!

    Ich war gerade dabei, ein DirectX Tutorial zu machen. Allerdings scheitere ich schon beim Erstellen des Fensters. Ich habe nach Anweisung das DirectX SDK und das PSDK installiert und in meinen Visual C++ 2005 Express eingebunden. Das Standardfenster kann ich mir auch prima anzeigen lassen, versuche ich es nach dieser Anleitung, geht etwas schief. Soweit ich es überblicke, habe ich alle Include, Bin und Lib Verzeichnisse angegeben.

    Hier der link zum Tutorial:
    1. http://www.codeworx.org/directx_tuts_dd3_1.php
    2. http://www.codeworx.org/directx_tuts_dd3_2.php

    Habe den Code wie folgt abgetippt:

    #include <windows.h>
    
    #define WindowTitle "DirectDraw-Tutorial"
    #define WindowClassName "DDWinClass"
    
    LONG FAR WINAPI WndProc (HWND , UINT , UINT , LONG) ;
    
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //Die Main-Funktion
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
       MSG msg ;
       HWND hwnd ;
       WNDCLASS wndclass ;
    
    	 if (!hPrevInstance)
       {
          wndclass.style = CS_HREDRAW | CS_VREDRAW ;
          wndclass.lpfnWndProc = WndProc ;
          wndclass.cbClsExtra = 0 ;
          wndclass.cbWndExtra = 0 ;
          wndclass.hInstance = hInstance ;
          wndclass.hIcon = LoadIcon (NULL , IDI_APPLICATION) ;
          wndclass.hCursor = LoadCursor (NULL , IDC_ARROW) ;
          wndclass.hbrBackground = (HBRUSH)GetStockObject (LTGRAY_BRUSH) ;
          wndclass.lpszMenuName = NULL ;
          wndclass.lpszClassName = WindowClassName ;
          RegisterClass (&wndclass) ;
       }
    
    	 hwnd = CreateWindow (WindowClassName ,
       WindowTitle ,
       WS_OVERLAPPEDWINDOW ,
       CW_USEDEFAULT ,
       CW_USEDEFAULT ,
       CW_USEDEFAULT ,
       CW_USEDEFAULT ,
       NULL , NULL ,
       hInstance , NULL) ;
       ShowWindow (hwnd , nCmdShow) ;
       UpdateWindow (hwnd) ;
    
    	 while(1)
       {
          if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
          {
             if (msg.message == WM_QUIT) break;
             TranslateMessage(&msg);
             DispatchMessage(&msg);
          }
       }
    
    	 return msg.wParam ;
    
    } // WinMain
    //Main-Funktion Ende
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    
    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    //Die Fensterprozedur
    LONG FAR WINAPI WndProc (HWND hwnd , UINT message , UINT wParam , LONG lParam)
    {
       switch (message)
       {
          case WM_DESTROY:
          {
             PostQuitMessage (0) ;
             return 0 ;
          } break;
       } // switch (message)
       return DefWindowProc (hwnd , message , wParam , lParam) ;
    } // WndProc
    //Fensterprozedur Ende
    //++++++++++++++++++++++++++++
    

    Hier die Fehlerausgabe:

    ------ Erstellen gestartet: Projekt: vc++_dx, Konfiguration: Debug Win32 ------
    Kompilieren...
    main.cpp
    c:\dokumente und einstellungen\luka\eigene dateien\fh\gd\game\vs2005\vc++_dx\vc++_dx\main.cpp(28) : error C2440: '=': 'const char [11]' kann nicht in 'LPCWSTR' konvertiert werden
            Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    c:\dokumente und einstellungen\luka\eigene dateien\fh\gd\game\vs2005\vc++_dx\vc++_dx\main.cpp(40) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [11]' in 'LPCWSTR' nicht möglich
            Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    c:\dokumente und einstellungen\luka\eigene dateien\fh\gd\game\vs2005\vc++_dx\vc++_dx\main.cpp(54) : warning C4244: 'return': Konvertierung von 'WPARAM' in 'int', möglicher Datenverlust
    c:\dokumente und einstellungen\luka\eigene dateien\fh\gd\game\vs2005\vc++_dx\vc++_dx\main.cpp(72) : warning C4244: 'return': Konvertierung von 'LRESULT' in 'LONG', möglicher Datenverlust
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\luka\Eigene Dateien\FH\GD\Game\VS2005\vc++_dx\vc++_dx\Debug\BuildLog.htm" gespeichert.
    vc++_dx - 2 Fehler, 2 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    

    Ich habe schon nach den Fehlercodes gesucht und in der Hilfe auch schon was gefunden - allerdings weiß ich nicht, wieso hier ein Wert falsch konvertiert wird. Kann mir jemand weiterhelfen?

    Vielen Dank im Voraus!



  • LPCWSTR ist ein wchar_t* (also Multibyte-String). Also solltest du entweder konsequent wchar_t verwenden (anstelle von char - wchar_t-Literale schreibst du als L"...") oder Konvertierungsmakros (CA2W dürfte passen).


  • Mod

    Oder man verwendet stringent TCHAR und die T-Notation T("string"). In diesem Fall wird dann je nach Unicode/Nicht Unicode das Literal behandelt.



  • Vielen Dank erst einmal für die promte Hilfe!

    Junge, Junge, war schon drauf und dran, wieder Fehlermeldungen zu posten 🙂

    Jetzt geht es aber! Allerdings nur, wenn ich L"..." schreibe. Mit T"..." oder T("...") funktioniert es nicht.

    Gibt es eventuell eine (gute) Übersicht im Internet, wo ich mir diese Geschichte mal zu Gemüte führen kann?

    Naja, vielen herzlichen Dank nochmal - ich bin begeistert! :xmas1:

    Edit:
    Ich habe gerade noch ein wenig recherchiert. Dabei bin ich auch auf die Möglichkeit gestoßen, unter Projekt->Eigentschaften->Konfigurationseigenschaften->Allgemein den Zeichensatz von Unicode auf "nicht festgelegt" zu stellen (Multi-Byte war auch möglich). So funktioniert es auch ohne das vorangestellte "L". Ist das auch eine gute Möglichkeit? Oder worauf kommt es bei der ganzen Sache an? Wie oben schon angefragt: gibt es eine Seite, auf der man sich darüber informieren kann, was es alles mit Unicode, Chars etc auf sich hat?

    Gruß,
    Lukas



  • Ja, bei uns im Magazin hat Jochen Kalmbach einen recht ausführlichen Artikel zum Thema Unicode geschrieben. Und die MSDN liefert sicher auch einige Informationen zu dem Thema.



  • Ja super, ich werde da mal schauen.

    Besten Dank nochmal!



  • iop schrieb:

    Jetzt geht es aber! Allerdings nur, wenn ich L"..." schreibe. Mit T"..." oder T("...") funktioniert es nicht.

    Es heisst auch nit "T", sondern "_T" !
    Und dazu noch
    #include <tchar.h>
    nicht vergessen...

    PS: Der erwähnte Artikel ist hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-161855.html



  • CStoll schrieb:

    LPCWSTR ist ein wchar_t* (also Multibyte-String).

    Nö, wchar_t ist ein Wide-Char-String. Multibyte ist immer mit char*, bloss ist das die lästige char* Variante wo ein Codepoint manchmal durch 2 oder 3 Byte dargestellt wird, im gegensatz zu Single-Byte, wo ein Codepoint immer genau ein char ist. 🙂



  • Abgesehen davon das "wchar_t" eigentlich auch Multibyte ist (oder hast Du etwa mein Artikel nicht gelesen!?)...



  • Ich hatte grad eben noch des gleiche Problem und bin dann durch dich draufgekommen, dass man in Allgemein einfach nur ATL auf statisch und Multi-Byte einstellen muss! Danke!


Anmelden zum Antworten