Erste WinAPI Anwendung mit VC++ fehlerhaft



  • Hallöchen alle zusammen.

    Auf Anraten der WinAPI-FAQ hin habe ich angefangen das WinAPI-Tutorial
    http://www.winprog.org/tutorial/start.html
    durchzuarbeiten. Leider geht der Autor nicht auf Compiler selbst ein, und daher habe ich direkt das erste Problem:
    Mein VS 2012 kompiliert den vorgegebenen Code nicht, obwohl die zugehörige (vom Autor erstellte) VC++ Datei identisch ist und einwandfrei kompiliert und ausführt.

    Der Code ist

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

    Ich erstelle also eine Win32-Anwendung und gebe den Code ein, anschließend erhalte ich folgenden Fehler:

    1>------ Erstellen gestartet: Projekt: Win32Project7, Konfiguration: Debug Win32 ------
    1>  Quelle.cpp
    1> error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [6]' in 'LPCWSTR' nicht möglich
    1>          Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    

    Was mache ich denn falsch / der Autor anders?

    Danke und liebe Grüße,
    mulo



    1. Projekteinstellungen -> Allgemein -> Zeichensatz auf Multibyte Umstellen
    2. MessageBoxA statt MessageBox nutzen
    3. Unicodestrings nutzen:
    L"Text Hier"
    

    Such dir eins aus 😃



  • Vielen Dank, das war ja einfach :p
    Was genau war denn die Fehlerursache? Wär super wenn du mir einen Satz dazu sagen könntest, ich will ja verstehen was da vor sich geht.

    Merci



  • Das WinAPI hat von vielen Funktionen zwei Varianten: Eine Unicode- und eine ANSI-Variante. Die heutigen Windows-Versionen nutzen intern immer Unicode; die ANSI-Funktionen konvertieren nur und reichen es dann an die entsprechende Unicode-Funktion weiter (zumindest hab ich das so gelesen). Das und noch einige andere Gruende haben dazu gefuehrt, dass Visual Studio heute standardmaessig auf Unicode gestellt ist. Wenn du z.B. MessageBox aufrufst ist das nur ein define, das je nach dem, ob Unicode gesetzt ist oder nicht, MessageBoxA oder MessageBoxW ist.
    Die Unicode-Funktionen nehmen dann natuerlich auch einen Unicode-String als Parameter; deswegen hats bei dir gekracht.
    Langfristig ist die Sauberdte Loesung Unicode zu verwenden, also L"" zu verwenden, oder noch sauberer, weil notfalls doch unter ANSI-Einstellungen kompilierbar, dafuer aber schreibaufwaendig: TEXT("") .



  • Wunderbar, vielen Dank, ich werde mit Unicode L"" weitermachen.
    Wie aber darf ich dieses L im Zusammenhang mit C++ sehen? Ist das ein Konvertierungsoperator? Mir wäre neu, dass man Buchstaben als Operatoren verwenden kann.



  • Nein, es handelt sich hierbei um ein Literal. L"" ist eine Widecharacter-Zeicehnfolge.
    Genauso kannst du ja eine Gleitkommazahl mit f suffixen, um sie zu einem float zu machen.


Anmelden zum Antworten