Konvertierung von const char in LPCWSTR



  • Hallo,

    ich habe mir ein Buch zugelegt, dass in die WinApi einführt und das erste Beispiel abgeschrieben. Der Ausschnitt, bei dem die Fehler auftreten sieht so aus:

    Win.lpszClassName = "???"; //Fehler 1
      Win.lpszMenuName = NULL;
      RegisterClass (&Win);
    
      GHandle = CreateWindow (Win.lpszClassName, "Titel", "Fenster", CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth, MaxHeight, NULL, NULL, hInstance, NULL); // Fehler 2
    

    Doch ich bekomme folgende zwei Fehler:

    Fehler 1 error C2440: '=': 'const char [4]' kann nicht in 'LPCWSTR' konvertiert werden c:\users\user\desktop\programmieren\c++\programme\test1111\test1111\test1111.cpp 24
    Fehler 2 error C2664: 'CreateWindowExW': Konvertierung des Parameters 3 von 'const char [6]' in 'LPCWSTR' nicht möglich c:\users\user\desktop\programmieren\c++\programme\test1111\test1111\test1111.cpp 28

    Woran liegt das und wie kann ich das beheben?
    Danke im Voraus



  • Sorry, ich hab' einen Fehler gemacht:
    Im Original sieht das so aus:

    Win.lpszClassName = "???"; //Fehler 1
      Win.lpszMenuName = NULL;
      RegisterClass (&Win);
    
      GHandle = CreateWindow (Win.lpszClassName, "Titel", WS_TILED, CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth, MaxHeight, NULL, NULL, hInstance, NULL); //Fehler 2
    

    Doch es funktioniert trotzdem nicht!



  • FAQ lesen !

    CreateWindowA



  • Ich hoffe, du kennst den Unterschied zwischen Unicode und ASCII/Codepages (mehr dazu)?
    Windows arbeitet jedenfalls intern mit Unicode (afaik mit UTF-16 oder UCS-2), bietet aber in der WinAPI bei Funktionen und Strukturen, welche irgendwie mit Strings hantieren sowohl Unicode-, als auch ASCII-Versionen an. Bei CreateWindowEx gibt's z.b. die Funktionen CreateWindowExA und CreateWindowExW , die A-Version arbeitet mit ASCII-Strings, die W-Version mit Unicode-Strings. Im windows.h -Header gibt's dann eine Präprozessor-Unterscheidung:

    #ifdef _UNICODE_  // Oder so, weiß grad nicht den genauen Namen
      #define CreateWindowEx CreateWindowExW
    #else
      #define CreateWindowEx CreateWindowExA
    #endif
    

    Du (bzw der Compiler, siehe Optionen) hast wahrscheinlich _UNICODE_ definiert, also wird die CreateWindowExW -Funktion verwendet, welche LPCWSTR ( const short* ) statt LPCSTR ( const char* ) als Parameter nimmt.
    Entweder arbeitest du also mit Unicode-Strings

    Win.lpszClassName = L"???"; //Man beachte das L
    ...
    GHandle = CreateWindow (Win.lpszClassName, L"Titel", WS_TILED, CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth, MaxHeight, NULL, NULL, hInstance, NULL);
    

    oder du nimmst das _UNICODE_-Flag raus und lässt deinen Code wie er ist, oder du nimmst die "unabhängige" Version, der Quellcode kann also sowohl mit _UNICODE_ als auch ohne kompiliert werden:

    Win.lpszClassName = TEXT("???"); //Man beachte das TEXT
    ...
    GHandle = CreateWindow (Win.lpszClassName, TEXT("Titel"), WS_TILED, CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth, MaxHeight, NULL, NULL, hInstance, NULL);
    


  • Danke, Badestrand. Mit dem L funktioniert es einwandfrei!


Anmelden zum Antworten