Einstieg in Windowsprogrammierung
-
Hi,
ich wollte von der herkömmlichen C/C++ Programmierung auf Windows umsteigen, hab aber einige Fragen und Probleme beim Einstieg.
1. Bereits ein kleines Testbeispiel aus dem net funktioniert bei mir nicht. Da kommt ein Fehler dass "Hello" undeclaried sei (first use this function).
#include <windows.h> int WINAPI WinMain(HINSTANCE d1, HINSTANCE d2, LPSTR d3, int d4) { MessageBox(NULL, ”Hello World”, ””, MB_OK); }Ich benutze den Bloodsheed Dev-C++ Compiler auf Windows Xp. Ich nehme an, ich muss noch irgendetwas in das Programm einfügen oder noch irgendwelche anderen Header laden, damit das Programm ausführbar wird, hab aber keine Ahnung welche.
2. Wo finde ich Informationen und Anleitungen für absolute Neueinsteiger bzw. Umsteiger?
Vielen Dank für eure Hilfe.

-
1.) Deine Anführungszeichen um deine Strings sehen zumindest hier im Forum etwas komisch aus...
2.) z.B. http://www.win-api.de/tutorials.php
-
flenders schrieb:
1.) Deine Anführungszeichen um deine Strings sehen zumindest hier im Forum etwas komisch aus...
Warum? Ich mach das auch immer so, und in Deinem Tut steht es auch so drin.
Mich macht eher das hier stutzig:HINSTANCE d1, HINSTANCE d2, LPSTR d3, int d4Außerdem fehlt
return 0;.
Hier noch ein Tutorial:
http://pronix.linuxdelta.de/C/win32/index.shtml
-
Also bei mir sieht das so aus:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
-
Also wenn ich das Programm kompiliere, dann kommt neben dem Fehler undefined function noch mehrmals der Fehler stray '\148' in program vor. Alle Fehlermeldungen beziehen sich laut Compilermeldung auf Line 5, also die MessageBox-Zeile.
Kennt vll jemand einen einfacheren C++ Compiler, wo man einfach sein Windowsprogramm reinschreiben und kompilieren kann? Vielleicht ist das Dev-C++ ja für Windowsprogramme nicht geeignet oder zu kompliziert...

Freundliche Grüße vom Umsteiger
-
Sqwan schrieb:
Also bei mir sieht das so aus:
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)Dat is wuscht
. (Obwohls natürlich besser aussieht)@Umsteiger: Probier mal das:
#include <Windows.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char* szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("Hello World!"), TEXT("Das ist ein Win32-Programm."), MB_OK | MB_ICONINFORMATION); return (0); }
-
Umsteiger schrieb:
Kennt vll jemand einen einfacheren C++ Compiler, wo man einfach sein Windowsprogramm reinschreiben und kompilieren kann? Vielleicht ist das Dev-C++ ja für Windowsprogramme nicht geeignet oder zu kompliziert...

Der Dev-C++ ist schon ganz gut (eine IDE will immer auch ein bißchen kennengelernt werden, aber dann erleichtert sie die Arbeit ungemein! Alternativ gibt es bei Borland bcc5.5 als Freeware- Kommandozeilen-Compiler). Aber der beste Compiler hilft Dir nix, wenn Du die Aufruf- und Rückgabekonventionen nicht beachtest und die Parameter nicht richtig übergibst. Da spuckt jeder Compiler Fehler aus.
Nur so als Hinweis:
int WINAPI WinMainbedeutet, daß die Funktion einen int-Wert zurückgibt. Das macht man normalerweise mit "return 0;"
Die vier Parameter im Funktionskopf von WinMain sind festgelegt und werden von Windows benötigt. Da kann man nicht einfach so d1-d4 einsetzen- es sei denn, man hat dafür vorher Variablen deklariert und entsprechend inizialisiert.
-
Cool, jetzt funktioniert es!
DANKE!

Beste Grüße,
Umsteiger
-
Hmm ist ja schön das es jetzt funktioniert hat. Aber ich denke du solltest noch Fragen warum das jetzt so ist, da einfach nachmachen leicht ist und beim nächsten mal vielleicht nicht mehr funzt. Deshalb solltest du schon Wissen was du machst.
Leider weis ich es nicht mehr genau was es damit zu tun hat (glaube Unicode?) Also sollte jemand anderes dir noch mal ne erklärung geben.MfG schirrmie
-
Also bei mir läuft der Code einwandfrei, wenn ich ” durch " ersetze...

-
@schirrmie:
Jo dem stimme ich zu
.flenders schrieb:
Also bei mir läuft der Code einwandfrei, wenn ich ” durch " ersetze...

Jops, und vllt. noch sinnvoll einen Wert zurückzugeben
(auch wenn das IMHO nur mit einer Warnung gefahndet wird).
-
Da kann man nicht einfach so d1-d4 einsetzen- es sei denn, man hat dafür vorher Variablen deklariert und entsprechend inizialisiert.
Das habe ich ja noch nie gehört, genauso wenig wie jeder Compiler den ich jemals benutzt habe
.
Das sind doch nur Bezeichner mit denen man die Variablen im Programm identifizieren kann.Das ist erst einmal eine stink normale Funktion mit einer bestimmten Aufrufkonvention die du da ja auch erstmal definierst.
Als Einsprungspunkt eines Windowsprogramms wird halt nur "zufällig" eine Funktion erwartet die WinMain heißt, die int zurückgibt und zwei HINSTANCE Parameter sowie einen Zeiger auf einen String und einen int-Wert erwartet sowie die aufrufkonvention hinter WIAPI ( also _stdcall (??)) aufweist.
Mit etwas Extraarbeit wäre es sogar möglich jede Beliebige Funktion als Einsprungspunkt zu wählen.
Wobei Extraarbeit das falsche Wort ist, mit der WinMain wird einem diese Arbeit einfach nur abgenommen, kann man jedoch auch selbst erledigen.Dann könnte das sogar sowas wie :
bool lalahuptroet(int d1, int d2, int d3, int d4, int d5, int d6, int d7);
werden.
-
Also, soweit ich weiß, werden zumindest hInstance und hPrevInstance von Windows vergeben. Da sollte man nicht hineinpfuschen, sonst kommt das ganze Instanzen-Handling durcheinander.
Kahino schrieb:
Mit etwas Extraarbeit wäre es sogar möglich jede Beliebige Funktion als Einsprungspunkt zu wählen.
Wobei Extraarbeit das falsche Wort ist, mit der WinMain wird einem diese Arbeit einfach nur abgenommen, kann man jedoch auch selbst erledigen.Ich habe ja auch geschrieben, daß man die Parameter nicht "einfach so" ersetzen kann. Sicher gibt es noch andere Wege, ein Windows-Programm zu starten zu starten. Allerdings stellt sich die Frage, warum man sich als Neueinsteiger wie "Umsteiger" die Umstände machen soll, zweitens setzt es einiges Wissen über Windows-Programmierung voraus. Dieses Wissen habe ich nicht, und "Umsteiger" als Neueinsteiger noch viel weniger. In diesem Stadium sind solche Antworten wohl eher verwirrend als hilfreich.
Dann könnte das sogar sowas wie :
bool lalahuptroet(int d1, int d2, int d3, int d4, int d5, int d6, int d7);
werden.
Dann frage ich mich, warum mein Linker immer nach einer "WinMain" sucht, wenn ich mich mal vertippt habe.
-
Hier meins kennt ja anscheinend niemand mehr ^^
http://endy.web.my-ct.de/winapi/
Is leider voller rechtschreibfehler... alles aus meiner schulzeit so von Visual Studio 6.0er Zeiten

-
Woow!
Das ist endlich mal ein richtig umfassendes Tutorial, das sich nicht nur auf die Anfänge beschränkt. 
-
Kahino schrieb:
Mit etwas Extraarbeit wäre es sogar möglich jede Beliebige Funktion als Einsprungspunkt zu wählen.
Wobei Extraarbeit das falsche Wort ist, mit der WinMain wird einem diese Arbeit einfach nur abgenommen, kann man jedoch auch selbst erledigen.
Dann könnte das sogar sowas wie :
bool lalahuptroet(int d1, int d2, int d3, int d4, int d5, int d6, int d7);
werden.Also was der Quatsch soll, würd mich auch mal interessieren
...
-
Da kann man nicht einfach so d1-d4 einsetzen- es sei denn, man hat dafür vorher Variablen deklariert und entsprechend inizialisiert.
Bezogen habe ich mich einfach auf diese Aussage und gab das weitere Zeug nur an um deutlich zu machen, dass WinMain eine gewönliche Funktion ist deren Bezeichner frei wählbar sind.(Auch ohne "Extraarbeit"
)
Esi st egal ob ich die erste HINSTANCDE -Variable nun hInstance, hinstance oder d1 nenne.
Es sind nur Namen.Und es it klar dass du eine Fehlermeldung bekommst wenn du kein WinMain schreibst.
Die ganzen Standardbibliotheken die du mit jedem Programm mitlinkst schreiben diese Funktion nunmal als Einsteigspunkt ins Programm vor und das macht ja auch Sinn, weil man die Parameter nunmal braucht ... teilweise.
Doch wollte ich nur darauf hinaus dass die WinMain-Funktion sich nicht großartig von anderen Funktionen unterscheidet, indem ich darauf hinwies, dass man auch jede andere Funktion als Einsprungspunkt wählen kann.@CodeFinger
Mit etwas Extraarbeit wäre es sogar möglich jede Beliebige Funktion als Einsprungspunkt zu wählen.
Wobei Extraarbeit das falsche Wort ist, mit der WinMain wird einem diese Arbeit einfach nur abgenommen, kann man jedoch auch selbst erledigen.
Dann könnte das sogar sowas wie :
bool lalahuptroet(int d1, int d2, int d3, int d4, int d5, int d6, int d7);
werden.Speziell die Funktion
lalahuptroet(int d1, int d2, int d3, int d4, int d5, int d6, int d7); macht ja auch keinen Sinn, war ja auch nur ein Beispiel.Im allgemeinen wird diese Technik heutzutage ja auch nicht mehr benutzt, doch noch interessant für Leut die vorhaben ganze computerspiele(WIN32, im Fenster und Graphikausgabe) oder sowas in 4 KB oder weniger zu quetschen.
Also solltest du das nicht als Quatsch bezeichnen nur weil du sowas nicht brauchst.