Problem mit 'LPCWSTR'



  • Unter VC++2005:

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
        LPSTR lpCmdLine, int nCmdShow)
    {
        MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
        return 0;
    }
    

    kriege ich:

    Error 1 error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [22]' to 'LPCWSTR' c:\documents and settings\zdravko\my documents\visual studio 2005\projects\mda_test2\mda_test2\main_mda.cpp 6

    Warum?



  • Mach einfach

    L"bla"
    

    für eine UNICODE-Zeichenkette



  • Danke! :p



  • Besser ist die Verwendung des TEXT (windows.h) bzw. _T(tchar.h)-Makros.



  • Ja, ich verwände in zwischen eigentlich auch nur noch das TEXT("blubb") Makro 😉

    Aber diese unglaublich vielen verschiedenen Typen nerven irgendwie:
    PSTR, LPSTR, LPCSTR, LPCTSTR, LPWSTR usw.

    Wozu gibt es überhaupt so viele verschiedene Typen?
    Kann es sein dass einiges davon aus den Win16-Bit-Versionen stammt und bis heute mitgeschleppt wird?



  • LukasBanana schrieb:

    Ja, ich verwände in zwischen eigentlich auch nur noch das TEXT("blubb") Makro 😉

    👍 👍 👍

    LukasBanana schrieb:

    Aber diese unglaublich vielen verschiedenen Typen nerven irgendwie:
    PSTR, LPSTR, LPCSTR, LPCTSTR, LPWSTR usw.

    Wozu gibt es überhaupt so viele verschiedene Typen?
    Kann es sein dass einiges davon aus den Win16-Bit-Versionen stammt und bis heute mitgeschleppt wird?

    Hm also es gibt mittlerweile keine (n Unterschied zwischen ) LONG-Pointer bzw. FAR-Pointer. Deshalb ist PSTR und LPSTR das gleiche, also char* - immer ⚠ . LPCSTR ist das ganze in const. Alle diese Typen sind aber nur für den ANSI-Zeichensatz. LPCTSTR ist ANSI/UNICODE, je nach aktivierten Zeichensatz. LPWSTR ist nur UNICODE, also wchar_t*.

    Falls Du die Namen auflösen willst, musst Du Dir nur merken: LP bzw. P steht immer für ein Zeigertyp, STR immer für einen C-String-Datentyp. Ein W dazwischen kennzeichnet UNICODE-Strings (also wchar_t, 'w' für 'wide-strings' -> 'breite Zeichenketten'), ist dieses nicht vorhanden ist es ein ANSI-String (also char). Befindet sich noch ein C in der Typendefinition ist das Schlüsselwort const mit im Spiel. Es handelt sich also in der Regel um einen konstanten Zeiger. Ist das T mit im Typennamen enthalten (dann kann kein W enthalten sein), handelt es sich um einen Typ, der sich dem aktuell-definierten Zeichensatz anpasst (Je nachdem, ob das UNICODE-Makro definiert ist).

    Noch ein Tipp: Verwende einfach immer den Datentyp TCHAR und das TEXT-Makro. Wenn Du einen Zeiger auf TCHAR (also char oder wchar_t) brauchst, schreib einfach TCHAR*. Muss es konstant sein, schreibe: const TCHAR*. Damit ist es übersichtlich, Zeichensatz-unabhängig und eindeutig 😉 .


Anmelden zum Antworten