WinAPI funktioniert nicht mit Visual C++ wie im Tutorial beschrieben



  • Dieser Quellcode

    #include <iostream>
    
    int main()
    {
     std::cout << "Hallo\" << std::endl;
     std::cin.get();
     return 0;
    }
    

    aus http://www.henkessoft.de/C++/WinAPI/WinAPI%20Kapitel%201%20bis%206/api1.htm bringt folgenden Fehler zur Ausgabe:

    1>...projekte\winapi\winapi\main.cpp(5) : error C2001: Zeilenvorschub in Konstante.
    1>...\projekte\winapi\winapi\main.cpp(6) : error C2143: Syntaxfehler: Es fehlt ';' vor 'std::cin'
    

    Und dieser Quellcode

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hI, HINSTANCE, TCHAR*, int)
    {
     MessageBox(NULL, "Hallo", "", MB_OK);
     return 0;
    }
    

    Hatte diesen Fehler zur folge:

    1>...\projekte\winapi\winapi\main.cpp(5) : 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.
    


  • versuch es mal so,

    std::cout << "Hallo" << std::endl;
    

    und

    MessageBox(NULL, L"Hallo", "", MB_OK);
    


  • YEAH es klappt... aber was heißt das 'L' vor der Zeichenkette?



  • YEAH?!

    Also bei mir funktioniert blos das für SUBSYSTEM:CONSOLE
    Das mit dem String hätte mir aber eigentlich auch aufallen können oder hat man das in früheren Versionen noch so gemacht? Sieht mir aber eher so aus als wenn der Autor sich vertippt hätte weil wenn man ' " ' in einem "String" setzt benutzt man das '/' Zeichen.

    Bei dem Beispiel für SUBSYSTEM:WINDOW mit dem 'L' vor dem String (http://www.hs-augsburg.de/~sandman/c_von_a_bis_z/) kommt jetzt dieser fehler

    1>...\projekte\winapi\winapi\main.cpp(4) : error C2731: 'WinMain': Überladen der Funktion nicht möglich
    1>        d:\programmierung\visual studio 2008\projekte\winapi\winapi\main.cpp(3): Siehe Deklaration von 'WinMain'
    1>...\projekte\winapi\winapi\main.cpp(5) : error C2664: 'MessageBoxW': Konvertierung des Parameters 3 von 'const char [1]' 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.
    


  • Tabelle 3.1   Steuerzeichen (Escape-Sequenzen) in Zeichenkonstanten
    Steuerzeichen 	Bedeutung
    \a 	BEL (bell) – akustisches Warnsignal
    \b 	BS (backspace) – setzt Cursor um eine Position nach links
    \f 	FF (formfeed) – ein Seitenvorschub wird ausgelöst. Wird hauptsächlich bei Programmen verwendet, mit denen Sie etwas ausdrucken können.
    \n 	NL (newline) – Cursor geht zum Anfang der nächsten Zeile
    \r 	CR (carriage return) – Cursor springt zum Anfang der aktuellen Zeile
    \t 	HT (horizontal tab) – Zeilenvorschub zur nächsten horizontalen Tabulatorposition (meistens acht Leerzeichen weiter)
    \v 	VT (vertical tab) – Cursor springt zur nächsten vertikalen Tabulatorposition
    \" 	" wird ausgegeben
    \’ 	' wird ausgegeben
    \? 	? wird ausgegeben
    \\ 	\ wird ausgegeben
    \0 	ist die Endmarkierung eines Strings
    \nnn 	Ausgabe eines Oktalwerts (z.B. \033 = ESCAPE-Zeichen)
    \xhh 	Ausgabe eines Hexdezimalwerts
    

    \n wollte er warscheinlich tippen.



  • MessageBox(NULL, L"Hallo", L"", MB_OK);

    Dann geht´s
    So richtig schlau bin ich aber noch nicht geworden, was bedeutet 'L'MessageBox(NULL, L"Hallo", "", MB_OK);

    Und 'WinMain': Überladen der Funktion nicht möglich. Ist doch schon klar genug.



  • Bill Gate´s son schrieb:

    MessageBox(NULL, L"Hallo", L"", MB_OK);

    Dann geht´s
    So richtig schlau bin ich aber noch nicht geworden, was bedeutet 'L'MessageBox(NULL, L"Hallo", "", MB_OK);

    Und 'WinMain': Überladen der Funktion nicht möglich. Ist doch schon klar genug.

    1>...\projekte\winapi\winapi\main.cpp(4) : error C2731: 'WinMain': Überladen der Funktion nicht möglich
    1>        ...\projekte\winapi\winapi\main.cpp(3): Siehe Deklaration von 'WinMain'
    


  • Zeichenkonstanten bestehen aus einem Zeichen, welches zwischen zwei einfachen Hochkommata eingeschlossen wird. Zeichenkonstanten sind intern vom Typ int und werden durch entsprechenden Zeichencode (ASCII-Code) dargestellt. Einige Beispiele von Zeichenkonstanten:

    'a', 'b', '\t', '\n', 'x'

    Wollen Sie eine Zeichenkonstante vom Typ wchar_t verwenden, müssen Sie das Präfix L voranstellen:

    L'a', L'b', L'\t', L'\n', L'x'

    In der Praxis werden Sie höchstwahrscheinlich nie mit wchar_t zu tun haben, aber es sollte hier dennoch erwähnt werden.

    String-Literale (Stringkonstante)

    Ein String-Literal ist ein char-Array, welches mit dem schließenden Stringende-Zeichen \0 gespeichert wird. Außerdem werden String-Literale zwischen zwei doppelte Hochkommata gestellt.

    Beispiele:

    "Hallo Welt", "Hallo\nWelt\n"

    Sofern Sie auch hierbei so genannte Wide-String-Literale definieren wollen, muss auch hier das Präfix L vorangestellt werden.

    L"Hallo Welt", L"Hallo\nWelt\n"



  • für den fehler

    error C2664: 'MessageBoxW': Konvertierung des Parameters 3 von 'const char [1]' in 'LPCWSTR' nicht möglich

    kann ich nur den kopf schütteln, den die antwort habe ich dir bereits gegeben.
    bzw. hier etwas genauer.

    was das L zu bedeuten hat weis ich nicht, mit unicode kenn ich mich gar nicht aus, vermutlich steht aber das L für LONG aber nicht im sinne eines integers sondern eher wie das LP*STR für LONGPOINTER steht.

    und das mit der überladenen funktion kommt warscheinlich daher das du ein falsches project erstellt hast.



  • @rT!f@Ct schrieb:

    für den fehler

    error C2664: 'MessageBoxW': Konvertierung des Parameters 3 von 'const char [1]' in 'LPCWSTR' nicht möglich

    kann ich nur den kopf schütteln, den die antwort habe ich dir bereits gegeben.
    bzw. hier etwas genauer.

    was das L zu bedeuten hat weis ich nicht, mit unicode kenn ich mich gar nicht aus, vermutlich steht aber das L für LONG aber nicht im sinne eines integers sondern eher wie das LP*STR für LONGPOINTER steht.

    und das mit der überladenen funktion kommt warscheinlich daher das du ein falsches project erstellt hast.

    Hallo?! Ich bin genau nach Tutorial vorgegangen. Win32-Konsolenanwendung, SUBSYSTEM:WINDOW. Verarschen kann ich mich selber!



  • @rT!f@Ct schrieb:

    für den fehler

    error C2664: 'MessageBoxW': Konvertierung des Parameters 3 von 'const char [1]' in 'LPCWSTR' nicht möglich

    kann ich nur den kopf schütteln, den die antwort habe ich dir bereits gegeben.
    bzw. hier etwas genauer.

    was das L zu bedeuten hat weis ich nicht, mit unicode kenn ich mich gar nicht aus, vermutlich steht aber das L für LONG aber nicht im sinne eines integers sondern eher wie das LP*STR für LONGPOINTER steht.

    und das mit der überladenen funktion kommt warscheinlich daher das du ein falsches project erstellt hast.

    Das L vor einem String Literal, macht den Literal zu Unicode.

    BTW: benutzt doch einfach das _T("") Makro aus tchar.h.
    Das macht abhängig von dem Projekteinstellungen entweder Ansi oder Unicode Literale.

    Simon



  • Super theta und @rT!f@Ct ihr seit Super!!! Es funktioniert die Ausgabe ist:

    1>...\projekte\winapi\winapi\main.cpp(4) : error C2731: 'WinMain': Überladen der Funktion nicht möglich
    1>        ...\projekte\winapi\winapi\main.cpp(3): Siehe Deklaration von 'WinMain'
    

    dank SUBSYSTEM:WINDOWS

    Ihr seit so gut wie Frau Merkel

    Du bist Deutschland



  • LiGERWooD schrieb:

    Super theta und @rT!f@Ct ihr seit Super!!! Es funktioniert die Ausgabe ist:

    1>...\projekte\winapi\winapi\main.cpp(4) : error C2731: 'WinMain': Überladen der Funktion nicht möglich
    1>        ...\projekte\winapi\winapi\main.cpp(3): Siehe Deklaration von 'WinMain'
    

    dank SUBSYSTEM:WINDOWS

    Ihr seit so gut wie Frau Merkel

    Du bist Deutschland

    Für diesem Fehler musst Du einfach mal deiner Main Funktion die korrekte Signatur verpassen. Wenn Du das nicht kannst, lass Visual Studio es für dich tun, indem Du ein neues Win32 Window Projekt erzeugst und dort abguckst.

    SYSTEM:CONSOLE verlangt eine andere Main Signatur als SYSTEM:WINDOWS...

    Simon



  • wenn sich hier jemand verarscht, dann du dich selber. 😉

    ich hab beide beispiel von henkelsoft, auf VC6 und VC2008 fehlerfrei erstellen können.
    der weg den man gehen muss um SYSTEM:CONSOLE auf SYSTEM:WINDOWS zu stellen ist nur ein wenig anderst.



  • @rT!f@Ct schrieb:

    wenn sich hier jemand verarscht, dann du dich selber. 😉

    ich hab beide beispiel von henkelsoft, auf VC6 und VC2008 fehlerfrei erstellen können.
    der weg den man gehen muss um SYSTEM:CONSOLE auf SYSTEM:WINDOWS zu stellen ist nur ein wenig anderst.

    Höhrst du mir überhuapt zu?! Ich sagte ich habe es umgestellt er zeigt es sogar in den Compiler Anweisungen!



  • 🙄



  • LiGERWooD schrieb:

    Höhrst du mir überhuapt zu?! Ich sagte ich habe es umgestellt er zeigt es sogar in den Compiler Anweisungen!

    Also ich hab nichts gehört o0


Anmelden zum Antworten