L""



  • Hi,

    eine kurze Frage. Was bedeutet das L vor einer Zeichenkette, also z.B. L"BUTTON"?
    Ich werd da irgendwie nicht schlau drauß.

    Mfg, Martek



  • "TEST" -> const char[4]
    L"TEST" -> const wchar_t[4]

    Das L"" macht einen String zu einem Wide-char String. Dies ist bei vielen Winapi Funktionen nötig, da diese als ...W version wchar_t strings nutzen und die ...W versionen standartmäßig eingestellt sind. schreibt man ...A, so wird zwangsweise die Funktion genutzt, die normale char arrays nutzt (also ascii).
    Also z.B.
    CreateWindowEx -> CreateWindowExW => const wchar_t*, L"" benutzen
    CreateWindowExA => const char*, "" benutzen

    Schaltet man jedoch in den Projekteinstellungen Unicode ab, so wird die ...A Funktion (also char*) zur standartfunktion und will man die unicode version nutzen, muss man ...W anhängen.

    Ele



  • Um dieser ganzen Ein- und Umstellerei aus dem Weg zu gehen, ist alles automatisiert worden.
    Ein Beispiel: CreateWindow
    In WinAPI.h oder so ähnlich steht in etwa:

    #ifdef UNICODE //<-- Wenn Unicode (wchar_t) benutzt werden soll
    #define CreateWindow CreateWindowW //<-- Unicode Variante benutzen
    #else //<-- ansonsten
    #define CreateWindow CreateWindowA //<-- ASCII Variante benutze
    #endif
    

    Weiterhin gibt es noch das TEXT-Makro:

    #ifdef UNICODE
    #define TEXT(x) (L x)
    #else
    #define TEXT(x) (x)
    #endif
    

    Du hast dann die Möglichkeit deine Strings (Zeichenketten) automatisch vom Compiler anpassen zu lassen.
    Anstatt

    "Hall"
    

    schreibst du

    TEXT("Hallo")
    

    und der Compiler macht den Rest.
    So kannst du in den Compilereinstellungen einstellen, ob du Unicode oder ASCII benutzen willst und musst nicht mühevoll jeden String suchen und ein L davorsetzen.



  • Okay, das habe ich jetzt soweit begriffen und das mit TEXT() klappt auch.
    Jetzt hab ich nur noch ein Problem.

    Ich möchte mit GDI+ ein Bild mit der Image Class laden. Wenn ich das bild per lade, klappt alles.

    Image image(L"c:\\bild.bmp");
    

    Ich möchte das Bild aber per String übergeben, der voher aus einem Dialog kommt. Laut msdn muss man einen WCHAR* übergeben, aber das bekomme ich nicht hin.

    WCHAR* wFile = (WCHAR*)"c:\\bild.bmp";
    Image image(wFile);
    

    Das funktioniert schonmal nicht.

    Mfg, Martek


  • Mod

    martek schrieb:

    Okay, das habe ich jetzt soweit begriffen und das mit TEXT() klappt auch.
    Jetzt hab ich nur noch ein Problem.

    Ich möchte mit GDI+ ein Bild mit der Image Class laden. Wenn ich das bild per lade, klappt alles.

    Image image(L"c:\\bild.bmp");
    

    Ich möchte das Bild aber per String übergeben, der voher aus einem Dialog kommt. Laut msdn muss man einen WCHAR* übergeben, aber das bekomme ich nicht hin.

    WCHAR* wFile = (WCHAR*)"c:\\bild.bmp";
    Image image(wFile);
    

    Das funktioniert schonmal nicht.

    Scheinbar hast Du es nicht begriffen, weil Du wieder einen cast anstatt TEXT oder L verwendest.

    WCHAR* wFile = L"c:\\bild.bmp";
    Image image(wFile);
    


  • Ja, so ist mir das schon klar. Das Problem ist ja, das der Pfad aus einem Char* kommt, den ich von dem Dialog bekomme. Den krieg ich nicht in das Image hinein.



  • Versuche es mal mit der MultiByteToWideChar-Funktion von http://msdn.microsoft.com/en-us/library/dd319072(VS.85).aspx



  • Oder die komfortablen Cx2x (CA2W, CW2A, etc) Klassen:
    http://msdn.microsoft.com/en-us/library/awt7k7f5.aspx



  • Gibt sogar was aus der Standardbibliothek: http://www.cplusplus.com/reference/clibrary/cstdlib/mbstowcs/



  • Danke, ich habs mit mbstowcs hinbekommen. Danke nochmal 🙂



  • ich falle eigentlich regelmäßig damit auf die schnauze, wenn ich auf UniCode arbeite.

    Irgendwelche API Aufrufe, z.B. Sockets, jüngstes Beispiel bei mir inet_addr(..), existieren nur als char * Version.

    Sowas ist immer frustrierend. Das ganze dann wieder zu convertieren ist eig. nur nervig.

    Unicode ist wie IPv6.....alle sagen das ist die Zukunft, aber sie kommt einfach nicht 😉



  • Dass vorsintflutliche APIs nicht UNICODE-fähig sind ist eben normal. Man bedient sich dann eben WSAStringToAddress bzw. WSAAddressToString, wenn man es braucht und nicht konvertieren mag.
    Unicode mit IPv6 zu vergleichen ist auf jeden Fall verkehrt, das Erstere ist auf der Applikationsebene seit Jahren und auf der OS-Ebene noch länger Realität und Standard.


Anmelden zum Antworten