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ückungszustandWarnung 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 ProgrammWinMain
als Eintrittsfunktion verwendet oder ein reines WinAPI-Programm ohne Konsolemain
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 aufWindows (/SUBSYSTEM:WINDOWS)
stellen).Alternativ geht auch
/SUBSYSTEM:CONSOLE
, wenn du ein Konsolen-Fenster haben möchtest, wo du z.B. mitcout
Text ausgeben willst. Dann muss deinemain
-Funktion aber auch tatsächlichmain
heissen und eine entsprechende Standard-Signatur haben, die fürmain
zulässig ist (ohne diesenHINSTANCE
-Kram). Das würde ich aber einem Anfänger nicht empfehlen, da du dafür schon wissen solltest, wofür du z.B. dieseHINSTANCE
-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.
-
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.