Fehler beim Releasen von cpp programm in VisualStudio

Hallo,

ich bin Anfänger in c++ und aktuell am probieren eine Anwendung zu schreiben.

Wenn ich in VS Releasen auswähle und dies ausführe, erhalte ich folgende Fehler:

C28251
C4244
LNK2001
LNK1120

Habe schon im Internet nach Lösungen gesucht, aber die Lösungen haben nichts gebracht.

Bitte um Hilfe.

Falls jemand den Code braucht, ich kann ihn nach senden.

LG
AlexanderB

Ja nun, das sind nur die Fehlercodes. Ohne den genauen Text und den Code, auf den sich das bezieht, kann man da nichts konkretes sagen.

Vielen Dank für die schnelle Rückmeldung.

Hier ist der Code:

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

	static TCHAR const AppName[] = TEXT("WinAPItest");

	WNDCLASS WC;

	WC.style = 0;
	WC.cbClsExtra = 0;
	WC.cbWndExtra = 0;
	WC.lpfnWndProc = WndProc;
	WC.hInstance = hInstance;
	WC.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	WC.hCursor = 0;
	WC.hIcon = 0;
	WC.lpszMenuName = 0;
	WC.lpszClassName = AppName;

	RegisterClass(&WC);

	HWND hWindow;
	hWindow = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
		AppName,
		TEXT("WinAPItest"),
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		NULL,
		NULL,
		hInstance,
		NULL);

	ShowWindow(hWindow, nCmdShow);

	UpdateWindow(hWindow);

	MSG msg;

	while (GetMessage(&msg, NULL, 0, 0))
	{
		DispatchMessage(&msg);
	}

	return (msg.wParam);

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam) {

	switch (uiMessage)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	default:
		return DefWindowProc(hWnd, uiMessage, wParam, lParam);
	}

}

Kurze Frage, auch wenn sie nervig erscheint und vordergründig nix mit dem Thema zu tun hätte, aber was macht dein Code?

Moin,

Das ist irgendwo eine Annotation falsch - da ich in deinem Quellcode keine Annotation sehe, würde ich darauf tippen das der Fehler in der Windows.h oder weiteren Headern liegt.

Da werden ein paar Bits bei der Konvertierung abgeschnitten, in etwa so:

int lang = 0xff00;
char kurz = (char) lang;
// kurz -> 0x00;

Sehe aber in Deinem Quelltext auch nicht, wo das passieren sollte.

Das sind nur Warnungen, die man jetzt zwar ignorieren kann, später aber definitiv lösen sollte.

Das ist schon schwerer. Hier wird versucht den eigentlichen Code, der für Windows.h & Co. benötigt wird, zu linken. Ich dachte immer das die entsprechende LIB /zur Windows.h) automatisch eingebunden wird. Musst Du Dich mal da durch die Projekte-Optionen hangeln und suchen. Wobei dir die Fehlermeldung auch genau sagen müsste, was fehlt. Und das lässt sich auf die benötigten LIB abbilden.

mfg, ronny

sieht man doch - Fenster öffnen

Eigentlich so weit gar nichts. Ich bin nur am ausprobieren wie c++ funktioniert und es zu lernen.

Habe nichts geändert, dennoch sind die 2 Fehler verschwunden:

LNK2001
LNK1120

Die 2 Warnungen sind immer noch da, zusätzlich sind 3 neue Fehler da:

LNK 2005: "__int64 cdecl WndProc(struct HWND *,unsigned int,unsigned __int64,int64)" (?WndProc@@YA_JPEAUHWND@@I_K_J@Z) ist bereits in main.obj definiert.
LNK 2005: WinMain ist bereits in main.obj definiert
LNK 1169: Mindestens ein mehrfach definiertes Symbol gefunden.

Jetzt wird es etwas klarer …

Das wichtigste zuerst:

  1. Erst wird Dein Code kompiliert. D.h. aus Deiner CPP-Datei wird eine OBJ-Datei. Eine CPP-Datei muss in sich stimmig sein, also kompilieren lassen. Lässt sich die Datei nicht kompilieren, dann wird Schritt zwei gar nicht erst ausgeführt.
  2. Die OBJ-Dateien werden gelinkt. Dabei werden die Adressen berechnet, wo welche Daten liegen, wo welche Methode liegt, etc. Wenn das auch alles passt, wird Deine EXE erstellt.

Da der Linker einen Fehler meldet, ist Dein CPP-Code erstmal in sich stimmig. Aber…

Der Linker hat folgendes Problem: WndProc() ist doppelt. Du hast diese Methode einmal in der CPP deklariert und über die Windows.h hast Du die Deklaration ein zweites mal bekommen. Der Linker weis nur das hier etwas nicht stimmt. Entferne aus Deiner CPP mal die Deklaration für die WndProc.

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

WndProc ist für die Verarbeitung der Meldungen (Button geklickt, Maus bewegt, etc.) dadurch das die WndProc in der Windows.h deklarariert wird, wirst Du gezwungen eine entsprechende Methode zu implementieren (ähnlich bei abstrakten Methoden).

WinMain ist das gleiche Prinzip. Der Unterschied ist nur, das dort Dein Programm beginnt. Erst werden ein paar Dinge vom Compiler selber erledigt und dann wird diese Methode angesprungen. Und Du hast dann die „Kontrolle“ über Dein Programm.

Jetzt weiß ich wenigstens was WndProc() macht, aber wie kann ich eine entsprechende Methode implementieren ?

diese Zeile einfach löschen

ok, das habe ich schon getan. Aber dann kommt:

C28251: Inkonsistente Anmerkung für „WinMain“: diese Instanz verfügt über keine Anmerkungen.
lnt-Nicht initialisiert lokal: Die lokale Variable wurde nicht initialisiert.
C2065: „WndProc“: nichtdeklarierter Bezeichner
C4244: „return“: Konvertierung von „WPARAM“ in „int“, möglicher Datenverlust

Hab’ den geposteten Code gerade mal ausprobiert, und der funktioniert in der gegebenen Form direkt.

Wie hast du denn das Projekt erstellt? Visual Studio bietet ja solche „Wizards“ zum erstellen, die einem viel von dem lästigen Kram abnehmen, der mit Linkern und Compiler-spezfischen flags und Schaltern zu tun hat: Beim Starten von Visual Studio „Create new Project“ → „Windows Desktop Application“ wählen. Das, was dann unter „Headers“ und „Resources“ liegt, kann rausgelöscht werden, und in die Cpp-Datei kann das, was du ursprünglich gepostet hattest.

Aber noch nebenbei: Die Windows-API ist eigentlich C. Wenn du C++ ~„als Sprache“ lernen willst (um später mal sagen zu können „Ich kann ein bißchen C++“ „Ich hab’ schonmal was mit C++ gemacht“, würde ich dir empfehlen, mit einer Konsolenanwendung anzufangen, und ein bißchen was über die Sprache an sich und die STL zu lernen. Mit der Windows-API irgendwelche Buttons hinfrickeln hat mit C++ nämlich nicht viel zu tun, und… es gibt praktisch keinen Bereich, in dem man das noch braucht. Wenn man mit C/C++ ein GUI entwickeln will, nimmt man QT oder wxWidgets oder so…

Ich habe das Projekt immer leer erstellen lassen.

Ich hab schon Konsolenanwendungen programmiert, dass hat immer Fehlerfrei funktioniert.

Aber wieso sind das dann cpp-scripts wenn das wenig mit c++ zu tun hat ?

OK, danke für den Tipp, ich guck mal nach QT und / oder wxWidgets.

Vielen Dank, komischer weise hatte ich in Erinnerung, dass ich mal ein WinDesktopAnwendungsProjekt erstellt habe und es dort genauso nicht funktioniert hatte.

Nun, was genau die LNK-Fehler waren, ist (mir) jetzt nicht klar, aber ganz grob: Für ein Windows-Programm braucht man halt zusätzliche Libraries, die beim Linken (d.h. LNK) dazugewurschtelt werden. Das passiert normalerweise über Argumente, die an den Compiler gegeben werden (also irgendwelche Sachen wie -l win32 -l whatever, und man braucht ggf. einen include-Path usw. Das wird halt alles schon „vorbereitet“; wenn man ein „Windows Desktop Application“-Projekt erstellt.

Aber wieso sind das dann cpp-scripts wenn das wenig mit c++ zu tun hat ?

Das ist die spannende Frage. Man kann ein C-Programm schreiben, und das dann einfach mit einem C++ -Compiler compilieren, und dann sagen, das wäre C++ :smiley: (Und das ist nicht mal falsch).

Aber … C++ ist eben viel, viel, VIEL mehr als „C mit Klassen“. Um in die Konzepte der Sprache einen Einstieg zu finden, ist eine GUI-Anwendung wohl grndsätzlich nicht das beste (auch nicht wxwidgets oder QT).

Es ergibt sich daraus u.a. die Frage, was du meinst, wennn du dich selbst als „Anfänger“ bezeichnest…

Danke für die Erklährung.

Heißt das du schätzt mich besser ein als ich gesagt habe ?

Dass du die Frage nach einem „Danke für die Erklährung (sic)“ stellst, fand ich jetzt lustig :smiley: Du hast keine Ahnung, du weißt praktisch nichts. Schon dass du von „cpp-scripts“ geredet hast, fand ich unterhaltsam. Das klingt jetzt vielleicht persönlich diskreditierend, ist es aber nicht. Dass Ich weiß, dass ich nichts weiß – Wikipedia einen eigenen Wikipedia-Eintrag hat, hat Gründe. Irgendwann (wenn du alt bist - so wie ich :older_man: ) wirst du erkennen, dass niemand weiß wie irgendwas in der IT funktioniert. Das einzige, dessen du dir sicher sein kannst: Wenn du glaubst, irgendwas verstanden zu haben, dann hat irgendjemand vielleicht gut abstrahiert, aber du bist einen Schritt davor, auf die Ebene zu gehen, auf der du eben nichts mehr verstehst.

Aber zum Thema: Du hattest von „Konsolenanwendungen“ geredet, und davon, dass du „Anfänger in C++“ bist - der Punkt ist, dass das heißen kann, dass du dich an irgendeinem Blog-Post entlanggehangelt hast, und unverstanden Befehle eingetippt hast, bis "Hallo, welt" auf der Konsole ausgegeben wurde, oder dass du dich seit 10 Jahren mit C++ beschäftigt hast, und jetzt den Schritt in die GUI-Welt gehen willst. Ich weiß, dass ich nichts weiß - auch nicht, was dein Wissensstand ist.

Naja, im Bereich C++ weiß ich eigentlich so gut wie gar nichts. Aber mit Konsolenanwendungen habe ich mich schon vorher genauer auseinander gesetzt, da hab ich nicht einfach abgeschrieben.

Mein Wissensstand in C++ ist sehr schlecht, aber in anderen Sprachen ist er recht gut. Will nur mal in einige reingucken.

Das ist ja nicht verkehrt. Aber C++ hat eine Komplexität, die in der allgemeinen Form inzwischen einfach nicht mehr handhabbar ist. Man braucht eine Einschränkung, eine art „Gerüst“ oder „Korsett“ - oder irgendein Ziel.

Wenn man in anderen Sprachen Tutorials durcharbeitet, kommt im 3. Kapitel „Datei-IO“, im 5. „Netzwerke“, im 7. „GUI-Programmierung“, im 12. dann „Datenbanken“ oder so, und man kann das Tutorial in 21 Tagen durcharbeiten. Bei C++ ist das etwas anders …

https://abstrusegoose.com/249

Ich bin ja überzeugt davon, dass ich jeden, der von sich behauptet, sich mit C++ „auszukennen“, innerhalb kürzester Zeit vom Gegenteil überzeugen könnte. Aber … bisher habe ich noch niemanden getroffen, der sich angemaßt hat, das von sich zu behaupten :smiley:

Das hab ich auch bemerkt :joy:

Oh mann xD

Ich dachte C++ ist ähnlich wie andere Sprachen