Windows Fenster erstellen funktioniert nicht



  • Hallo ich habe ein mehr oder wenig kleines Problem, welches ich jetzt seit etwa 6 Stunden versuche zu lösen.
    Ich habe mir das Buch C++ für Spieleprogrammierer gekauft und bin bei Kapitel 10 (Grundlagen der Windowsprogrammierung) zu stehen gekommen da ich immer eine Fehlermeldung von Visual Studios 2019 bekomme.

    Ich habe hier schon eine Frage gefunden welche den Gleiche Code behandelt(Link Text).Anfangs hatte ich auch diese Fehlermeldungen. Das Problem mit dem umstellen von Unicode auf Multibyte habe ich schon gelöst allerdings kamen dann diese Fehlermeldungen.

    Der Fehler lautet:
    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand

    Warnung C28251 Inkonsistente Anmerkung für "WinMain": diese Instanz verfügt über keine Anmerkungen. Siehe c:\program files (x86)\windows kits\10\include\10.0.18362.0\um\winbase.h(933). Project1 C:\USERS\MMM\SOURCE\REPOS\PROJECT1\PROJECT1\QUELLE.CPP 6

    Fehler LNK2019 Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion ""int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)". Project1 C:\Users\Benedikt Lindorfer\source\repos\Project1\Project1\MSVCRTD.lib(exe_main.obj) 1

    Fehler LNK1120 1 nicht aufgelöste Externe Project1 C:\Users\Benedikt Lindorfer\source\repos\Project1\Debug\Project1.exe 1

    Was ist das Problem ich kann es einfach nicht verstehen denn der Code ist direkt von den Übungsdateien welche dem Buch beiliegen kopiert.

    Hier ist noch der Code welcher ein einfaches Windowsfenster erstellen soll:

    
    

    // C++ für Spieleprogrammierer
    // Listing 10.1
    // Ein Windows-Grundgerüst
    //
    #include <windows.h>

    // Prototyp der Callback-Funktion
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message,
    WPARAM wParam, LPARAM lParam);

    // Hauptprogramm
    //
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst,
    LPSTR lpcmdline, int ncmdshow)
    {
    WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften
    HWND hWnd; // Fenster-Handle
    MSG message; // Nachricht

    // Der Klassen-Name des Fensters ist frei wählbar
    const TCHAR szClassName[] = TEXT("Erstes Fenster");
    
    // Struktur mit gewünschten Eigenschaften füllen
    //
    
    // Größe der Struktur zwischenspeichern
    windowclass.cbSize = sizeof(WNDCLASSEX);
    
    // Fenster soll beim Verschieben neu gezeichnet werden
    windowclass.style = CS_HREDRAW | CS_VREDRAW;
    
    // Zeiger auf Callback-Funktion
    windowclass.lpfnWndProc = WindowProc;
    
    // Keine erweiterten Einstellungen
    windowclass.cbClsExtra = 0;
    windowclass.cbWndExtra = 0;
    
    // Instanz speichern
    windowclass.hInstance = hInst;
    
    // Icons und Cursor festlegen
    windowclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    windowclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    windowclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    
    // Hintergrundfarbe festlegen
    windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1;
    
    // Ein Menü brauchen wir nicht
    windowclass.lpszMenuName = NULL;
    
    // Klassenname angeben
    windowclass.lpszClassName = szClassName;
    
    // Fensterklasse registrieren
    if (!RegisterClassEx(&windowclass))
    	return (0);
    
    // Das Fenster erzeugen
    hWnd = CreateWindowEx(NULL,
    	szClassName,
    	TEXT("Das erste Fenster!"),
    	WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    	100, 100,
    	300, 250,
    	NULL,
    	NULL,
    	hInst,
    	NULL);
    
    // Prüfen, ob alles glatt ging
    if (hWnd == NULL)
    	return (0);
    
    // Der "Herzschlag" des Programms.
    // Hier werden alle Nachrichten abgeholt,
    // übersetzt und weitergeleitet.
    while (GetMessage(&message, NULL, 0, 0))
    {
    	TranslateMessage(&message);
    	DispatchMessage(&message);
    
    }
    
    // Programm beenden
    return (int)(message.wParam);
    

    } // WinMain

    // Callback-Funktion zur Nachrichtenverarbeitung
    //
    LRESULT CALLBACK WindowProc(HWND hWnd, UINT message,
    WPARAM wParam, LPARAM lParam)
    {
    // Messages auswerten
    switch (message)
    {
    // Fenster schließen? (Auch Alt-F4)
    case WM_DESTROY:
    {
    // Nachricht zum Beenden schicken
    PostQuitMessage(0);
    return (0);

    }
    
    // Wurde eine Taste gedrückt?
    case WM_KEYDOWN:
    {
    	// Ja, also je nach Taste verzweigen
    	switch (wParam)
    	{
    		// Wurde "Escape" gedrückt?
    	case VK_ESCAPE:
    	{
    		// Ja, also Nachricht zum Beenden schicken
    		PostQuitMessage(0);
    		return (0);
    
    	}
    	}
    } break;
    }
    
    // Die Nachricht wurde nicht von uns verarbeitet, also
    // von Windows verarbeiten lassen.
    return (DefWindowProc(hWnd, message, wParam, lParam));
    

    } // WindowProc```cpp



  • @Benedikt Wie hast du das Projekt angelegt?



  • @DirkB sagte in Windows Fenster erstellen funktioniert nicht:

    @Benedikt Wie hast du das Projekt angelegt?

    Ja, in die Richtung würde ich auch tippen, ohne mir den gesamten Code bis ins Detail angesehen zu haben. Probleme mit main/WinMain hängen meistens damit zusammen, dass ein als Konsolen-Projekt erstelltes Programm WinMain als Eintrittsfunktion verwendet oder ein reines WinAPI-Programm ohne Konsole main verwendet.

    @Benedikt Stell sicher, dass du, wenn du WinMain als Startfunktion benutzen möchtest, dem Linker die Option /SUBSYSTEM:WINDOWS übergeben wird (In Visual Stdio: Projekt-Eigenschaften->Linker->System->SubSystem auf Windows (/SUBSYSTEM:WINDOWS) stellen).

    Alternativ geht auch /SUBSYSTEM:CONSOLE, wenn du ein Konsolen-Fenster haben möchtest, wo du z.B. mit cout Text ausgeben willst. Dann muss deine main-Funktion aber auch tatsächlich main heissen und eine entsprechende Standard-Signatur haben, die für main zulässig ist (ohne diesen HINSTANCE-Kram). Das würde ich aber einem Anfänger nicht empfehlen, da du dafür schon wissen solltest, wofür du z.B. diese HINSTANCE-Handles brauchst und wie du anderweitig an diese herankommst.

    Und im Zweifelsfall: Das Projekt nochmal komplett neu anlegen und sicherstellen, dass du es als "Windows Desktop Application" und nicht "Windows Console Application" erstellst.

    Noch ein Tip: Stell dein Visual Studio besser auf Englische Sprache und arbeite dich in die englischen Begriffe ein, falls du damit Probleme haben solltest. Mit den deutschen Fehlermeldungen wirst du es ansonsten schwer haben, Lösungen zu finden.



  • @Benedikt sagte in Windows Fenster erstellen funktioniert nicht:

    // C++ für Spieleprogrammierer
    

    Wahrscheinlich möchtest Du das Buch wegwerfen, als Türstopper verwenden, einer ungeliebten Person schenken oder ähnliches.



  • Ok danke einmal für die Antworten. Ich habe gerade überlegt: Das Programm wurde in Visual Studio 2015 geschrieben, habe den Code dann aber in die neue IDE kopiert. Da hat das dann nicht funktioniert.
    Als ich dann aber Visual Studio 2015 heruntergeladen habe und das Programm da geöffnet habe hat alles super geklappt.
    Kann es sein dass die zwei Programme nicht ganz kompatibel sind?



  • Wie schon geschrieben, kommt es auf den Projekttyp (Konsole oder Windows Anwendung) an.



  • ja es ist egal, welche version von visual studio du nimmst. du musst ein neues leeres projekt erstellen, eine WinMain.cpp hinzufügen, o.g. code dort hineinkopieren, rechtsklick auf die projektmappe und einstellungen auswählen, linker "öffnen", system auswählen, subsystem auf "windows" ändern.

    und dann sollte das laufen.



  • @Benedikt

    habe den Code dann aber in die neue IDE kopiert.

    Warum? Du kannst die Solution doch mit VS2019 öffnen.



  • @Th69 Danke bin jetzt auch draufgekommen es kommt eben nur eine Meldung welche sagt das das Programm aus einer älteren Version stammt und man es zuerst Updaten muss. Jetzt funktionierts aber. Danke an alle.



  • @Benedikt sagte in Windows Fenster erstellen funktioniert nicht:

    es kommt eben nur eine Meldung welche sagt das das Programm aus einer älteren Version stammt und man es zuerst Updaten muss.

    Das ist immer so bei VS



  • @DirkB Früher immer. Bei neueren Versionen ist das nicht mehr. VS 2017 Projekte kann man problemlos in VS2019 aufmachen und bauen - vorausgesetzt das VS 2017 Toolset ist installiert.

    Meldung kommt trotzdem eine, aber man muss das Projekt nicht umstellen.


Anmelden zum Antworten