WINAPI Hallo World



  • MessageBoxW ist die Unicode-Variante. Stell Dein Projekt auf MultiByte um.



  • MessageBox ist nur ein Makro, welches abhängig von der Einstellung (Unicode oder Multibyte) zu MessageBoxW bzw. MessageBoxA expandiert.

    In deinem Projekt war anscheinend Unicode aktiviert und im Gegesatz zu einem ASCII-String wird einem Unicode-String ein L vorangestellt, damit der Compiler bescheid weiß, dass er diesen als solchen zu interpretieren hat:

    #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCMDLine, int iCmdShow)
    {
    
    MessageBox(NULL, L"Hallo World", L"Hallo World", MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);
    
     return 0;
    }
    

    Alternativ:

    #include <windows.h>
    #include <tchar.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCMDLine, int iCmdShow)
    {
    
    MessageBox(NULL, _T("Hallo World"), _T("Hallo World"), MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1);
    
     return 0;
    }
    

    Sollte dann auch laufen.



  • Ich würde die zweite Variante von "jkljk" verwenden, da diese unabhängig von den Compiler-Einstallungen ist. Die erste geht z.B. nur wenn auch _UNICODE definiert ist...



  • Jochen Kalmbach schrieb:

    Ich würde die zweite Variante von "jkljk" verwenden, da diese unabhängig von den Compiler-Einstallungen ist. Die erste geht z.B. nur wenn auch _UNICODE definiert ist...

    Die zweite Variante funktioniert nicht. 😞
    (Selbe Fehlermeldung)

    Die erste Funktioniert 👍
    Wie kann ich jetzt eine Variable so ausgeben ?

    Bsp. (Habs mal so versucht)

    const char bsp[] = "Hello World !!!";
    
    MessageBox(NULL, L(bsp), L"Hello World", MB_ICONINFORMATION |MB_OKCANCEL | MB_DEFBUTTON1);
    

  • Mod

    Die Antwort hast Du doch schon:
    1. MessageBox ist nur ein Markro
    2. In der Uicode Variante verweist dieser auf MessageBoxW
    3. WinAPI Funktionen mit einem W am Ende benutzen i.A. nur wchar_t für alle Texte.
    4. Entsprechend musst Du auch einen wchar_t Array übergeben

    const wchar_t bsp[] = L"Hello World !!!";
    MessageBox(NULL, bsp, L"Hello World", MB_ICONINFORMATION |MB_OKCANCEL | MB_DEFBUTTON1);
    


  • oder entsprechend TCHAR verwenden, welches je nach Projekteinstellungen entweder wchar_t oder char ist :p dann auch in Kombination mit _T.



  • Hallo, ich habe auch ein Problem mit dem WinAPI Hello World ähnlich dem des Threaderstellers.

    Ich habe schon erste Erfahrungen mit C++ und habe heute mit der WinAPI angefangen.
    Aber folgender Code läuft kompiliert unter Windows XP mit Visual C++ 2010 Express partout nicht auf Vista.

    #include <Windows.h>
    
    int WINAPI WinMain (HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int nCmdShow)
    {
    	MessageBox (NULL, "Hallo Welt!", "Hallo Welt!", NULL);
    	return 0;
    }
    

    Das ist sehr frustrierend, dass selbst der einfachste Code nicht einfach so auf Vista läuft.



  • Alternativ MessageBoxA verwenden es ist bestimmt Unicode aktiviert. Weshalb alle obig genannten Tipps funktionieren sollten.



  • Das ändert nichts an der Tatsache, dass es auf Vista nicht läuft.

    #include <Windows.h>
    
    int WINAPI WinMain (HINSTANCE hInstance,
    					HINSTANCE hPrevInstance,
    					LPSTR lpCmdLine,
    					int nCmdShow) {
    	MessageBoxA (NULL, "Hallo Welt!", "Hallo Welt!", MB_ICONINFORMATION | MB_OK);
    
    	return 0;
    }
    


  • Welchen Fehler hast du denn? Geht nicht ist kein Fehler.



  • Ich direkt habe den Fehler nicht, ein Bekannter mit Vista testet für mich.
    Er bekommt folgenden Fehler: "Hello World Messagebox.exe funktioniert nicht mehr..."



  • Mir fallen da 2 Gründe ein:

    1. Dein Bekannter hat die VC2010 C++ Redistributeable nicht installiert.
    2. Kompatibilitätsprobleme x86 und x64 bit (in dem Fall Projekteinstellungen überprüfen)



  • Das System vom Bekannten ist 32bit.

    Kann man das irgendwie abstellen, dass man immer die VC2010 C++ Redistributeable dazu braucht um meine Programme zu starten?

    Könnte ich dafür eventuell über eine andere IDE und Compiler ausweichen?





  • Danke, ich werds mir mal anschauen.

    EDIT:
    Ich bedanke mich sehr bei dir Jochen! 🙂

    Jetzt hätte ich aber eine weitere Frage: Was hat es mit dieser stdafx.h auf sich?
    Bei mir gibt es diese Headerdatei nicht!

    EDIT2:
    Soweit meine Nachforschungen ergaben kann man diese "stdafx.h" selber erstellen und dort Dateien inkludieren die Visual Studio vorkompilieren soll.
    Also wäre meine Frage beantwortet.

    lg Viken



  • stdafx.h wird bei "precompiled headern" verwendet.
    Für die meisten Programme wird dies aber nicht benötigt, und ich rate jedem dies abzuschalten; vor allem wenn man anfängt zu Programmieren.



  • Jochen Kalmbach schrieb:

    stdafx.h wird bei "precompiled headern" verwendet.
    Für die meisten Programme wird dies aber nicht benötigt, und ich rate jedem dies abzuschalten; vor allem wenn man anfängt zu Programmieren.

    Für was braucht man den precompiled headers ?



  • Prekompiled header beschleunigen das Erstellen von Anwedungen. Aber für Anfänger ist es unbrauchbar.



  • Precompiled Header sind auf Deutsch vorkompilierte Header die Visual Studio nicht bei jedem Build neu erstellt.
    In der stdafx inkludiert man Header von denen man weiß, dass diese nicht verändert werden, damit kann man den Buildvorgang bei großen(!) Projekten beschleunigen.

    Aber bei kleinen Projekten sehe ich da keinen großen Nutzen.



  • vikenemesh schrieb:

    Precompiled Header sind auf Deutsch vorkompilierte Header die Visual Studio nicht bei jedem Build neu erstellt.
    In der stdafx inkludiert man Header von denen man weiß, dass diese nicht verändert werden, damit kann man den Buildvorgang bei großen(!) Projekten beschleunigen.

    Aber bei kleinen Projekten sehe ich da keinen großen Nutzen.

    Richtig!


Anmelden zum Antworten