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.
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.
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.
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.
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.
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 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++ (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…
Dass du die Frage nach einem „Danke für die Erklährung (sic)“ stellst, fand ich jetzt lustig 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 ) 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 …
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