CALLBACK, WINAPI, FAR PASCAL !?
-
Pellaeon schrieb:
Nur wenn du eine DLL benutzt, musst du die Aufrufkonevntion wissen und evtl angeben, da ansonsten dann Fehler auftreten.
Nur als Anmerkung: Die Aufrufkonventionen muss man auch bei Callbacks angeben!
-
Nochmal eine kleine Anmerkung: Zukünfig wird die meist verwendete Calling-Convention
__fastcall
sein:
Siehe: Overview of x64 Calling Conventions: http://msdn2.microsoft.com/en-us/library/ms235286.aspx, da es hier nur noch __fastcall gibt.
-
Jochen Kalmbach schrieb:
Pellaeon schrieb:
Nur wenn du eine DLL benutzt, musst du die Aufrufkonevntion wissen und evtl angeben, da ansonsten dann Fehler auftreten.
Nur als Anmerkung: Die Aufrufkonventionen muss man auch bei Callbacks angeben!
Stimmt! Rührt daher das diese WinAPI-Funktionen halt die stdcall-Konvention benutzen.
-
Vielen Dank,
das hat mir schon weitergeholfen, mir ist der praktische Sinn zwar noch etwas unklar aber ich muss die infos auch erstmal verarbeiten ^^
-
Das ist kein praktischer sondern ein historischer Sinn^^.
Wenn du eine Funktione aufrufst, werden die Parameter auf den Stack geklatscht. Jetzt muss man aber wissen in welcher Reihenfolge das passiert, sprich das muss man einfach mal festlegen: vonn rechts nach links oder andersum. Naja und C und PASCAL haben das nun gerade unterschiedlich. Und da PASCAL und C damals ziemlich beliebt waren und auch verbreitet, haben sich nunmal 2 Konventionen durchgesetzt und damit muss man heute wohl oder übel arbeiten.Es gibt noch 2 weitere Konventionen(zumindest die ich kenne). Hier liegen die Unterschiede zum Auruf noch darin, wer den Stack wieder beräumt. Die Funktion oder der Aufrufer. Das ganze steht lustigerweise recht anschaulich in der Delphi-Hilfe *lol*
-
Ok das erklärt meine Probleme den wirklichen Sinn von CALLBACK und co zu verstehen. Aber ich glaube ich hab es nun einigermaßen kapiert.
Bisher hab ich daraus geschlossen das es die Funktionalität und den Quellcode meiner Programme nicht beeinflusst ob ich CALLBACK benutze oder nicht.
bei _fastcall und ASM muss ich aufpassen das sich die benutzung des Compilers von ECX und EDX nicht mit meinem ASM Code beisst.Wie mir jetzt auch noch gesagt wurde wird CALLBACK z.b. bei SetTimer() verwendet, um anstatt in WM_TIMER direkt in eine Funktion zu springen, wobei zweifelhaft ist ob man CALLBACk wirklich benötigt.
Ich hoff ich hab das jetzt so richtig aufgefasst, ansonsten schieb ich das einfach darauf das ich schlecht geschlafen hab
-
Taelan schrieb:
Wie mir jetzt auch noch gesagt wurde wird CALLBACK z.b. bei SetTimer() verwendet, um anstatt in WM_TIMER direkt in eine Funktion zu springen, wobei zweifelhaft ist ob man CALLBACk wirklich benötigt.
Warum soll das zweifelhaft sein? Wenn es in der Doku so drin steht (die Du auch lesen könntest), dann ist es unzweifelhaft!
TimerProc: http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/windowing/timers/timerreference/timerfunctions/timerproc.asp
-
Ich weiss nicht warum der Text das unzweifelhaft machen soll.
Da steht zwar das es eine CALLBACK funktion ist aber nicht das es ohne CALLBACK nicht funktioniert Ich hab ja nicht gesagt das man es generell ignorieren soll, nur das man es wohl evtl könnte.
-
da sieht man den Vorteil von copy & paste, da vergisst man das CALLBACK nicht
-
Nagut überredet ich benutz es einfach wenns da sein soll :p
Vorallem weil ich es grad nicht hinbekomm TimerProc richtig an SetTimer zu übergeben *hust*
-
Taelan schrieb:
Nagut überredet ich benutz es einfach wenns da sein soll
Was heisst "soll"? Eine Funktions deklaration ist nicht was optional es sondern was genau definiertes! Du kannst dem Compiler ja auch nicht nur ganz grob sagen was Du tun willst...
Es heisst also nicht "soll" sondern "muss"!