Ms VC Express 2oo8-Problem ...



  • Moin,

    ich habe da ein 'kleines' Problem mit oben genannter IDE.
    [OFFTOPIC]
    Bisher habe ich mit CodeBlocks und MinGW gearbeitet und bin eigentlich auch sehr zufrieden damit, außer dass für die Win32 programmierung nicht alle Header-Dateien vorhanden sind, wie z.B. commctl.h, um nur eine zu nennen.

    Also entschloss ich mich VC Express 2oo8 auszuprobieren, trotz 1,4 GB Installationsdateien und 1o MB Registryeinträgen. 🙄
    [/OFFTOPIC]

    Nun aber zu meinem Problem:

    Wenn ich einen C-String angebe wo eigentlich ein lpszBlaBlubb erwartet wird, dann meckert mich der Compiler an, er könne keinen char[] in einen (LPCSTR), bzw. (LPCWSTR) konvertieren.

    Bei CodeBlocks war das kein Thema und auch die meisten Code-Beispiele hier nutzen die mir bekannte schreibweise ...

    Beispiel:

    // Compiler beschwert sich über "button" und "Drück mich" ...
                CreateWindowEx (0, "button", "Drück mich", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                             10, 10, 80, 27,
                             hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ;
    
                // Keine Beschwerden, dafür aber auch kein Text sichtbar ...
                CreateWindowEx (0, (LPCSTR) "button", (LPCSTR) "Drück mich", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                             10, 10, 80, 27,
                             hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ;
    

    Der Button ist jetzt nur ein Beispiel, egal wo ich einen String setze, es gibt Compiler-Mecker.

    Wie ihr sicherlich aus meinem Post herauslesen könnt, bin ich noch blutiger Anfänger, also bitte nicht meckern, es reicht, dass der Compiler mich anmeckert ... 😉

    Desweiteren ist mir aufgefallen, dass der Compiler immer die Unicode-Funktionen aufruft, also CreateWindowExW etc.
    Das wollte ich eigentlich auch nicht, kann ich dass nicht irgendwo einstellen ?

    Vielen Dank für die Aufmerksamkeit.

    Gruß
    Greenhorn



  • Benutze _T("ein string").



  • simon.gysi schrieb:

    Benutze _T("ein string").

    ... ist das gleiche wie TEXT("Ein String") ???
    Werde es probieren.

    Vielen Dank Simon. 🙂

    Gruß



  • LPCSTR ist ein char string, also i.d.R. 8-bit ASCII/ANSI.
    LPCWSTR ist ein Wide-char string, also i.d.R. 16-bit Unicode.

    Um einen Unicode-String angeben zu können mußt Du den Prefix "L" voranstellen, also z.B. so:

    // Compiler beschwert sich nicht mehr ...
                CreateWindowEx (0, L"button", L"Drück mich", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                             10, 10, 80, 27,
                             hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ;
    

    Im ganzen Zusammenhang mußt Du wissen, daß es eine Einstellung #define UNICODE gibt.

    #define UNICODE 0 macht aus CreateWindowEx() eine CreateWindowExA()
    #define UNICODE 1 macht aus CreateWindowEx() eine CreateWindowExW()

    In Visual Studio 2008 ist als Voreinstellung UNICODE definiert!

    Und damit gehen wir einen Schritt weiter:
    Anstelle dem oben erwähnten Prefix "L" nimmst Du den Makro "TEXT()" oder "T()" (ist egal welcher), d.h. abhängig von der Einstellung UNICODE macht der Makro daraus entweder den ASCII/ANSI-String oder eben den Unicode-String.
    Diese Makros findest Du in der Include "tchar.h"
    Siehe Beispiel:

    #include <tchar.h>                                              //Definitions for generic international text functions.
    
                // Compiler beschwert sich nicht mehr ...
                CreateWindowEx (0, TEXT("button"), TEXT("Drück mich"), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                             10, 10, 80, 27,
                             hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ;
    

    Ich denke, das reicht erstmal für den Anfang?

    Martin



  • Tatsache ..., ➡ funzt ! 🙂

    Tausend Dank noch einmal !

    Und das mit der Unicodekompilierung ist Standard ?

    Gruß



  • Ja, Unicode ist der Default ab VS2005.
    Bei Windows XP und Vista (und wahrscheinlich auch NT und 2000) ist intern sowiso alles Unicode.

    Simon



  • Vielen Dank für die explizite Erklärung, Martin !

    Ja, das reicht für's erste ... 😃

    Sehr kompetentes Forum hier, weiß gar nicht warum soviele Anfragen/Antworten so harsch und ungeduldig ausfallen !

    Also nochmals: Mille Grazie 😉

    Gruß



  • C++Greenhorn schrieb:

    Sehr kompetentes Forum hier, weiß gar nicht warum soviele Anfragen/Antworten so harsch und ungeduldig ausfallen !

    ich weiß es: je dümmer und unspezifischer die fragen, desto harscher die antworten. 🙂


Log in to reply