Calling Convention WinAPI - WINAPI, CALLBACK, __stdcall

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 527
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Calling Convention WinAPI - WINAPI, CALLBACK, __stdcall

Beitrag von starcow »

Ich bin dabei mich ein bisschen in die WinAPI einzuarbeiten und lese dazu im dicken Welzer von guten alten Charles Petzold "Windows-Programmierung".

Auf Seite 53 (Deutsche Ausgabe) bin ich auf folgende Beschreibung gestossen, die mich widersprüchlich zu Wikipedia dünkt.

(Ich hoffe es ist in Ordnung ein kurzer Auszug vom Buch hier zu posten - ansonsten nehm ichs wieder raus)
In den 16-Bit-Versionen standen diese beiden Bezeichner für verschiedene Dinge (Anm. die Rede ist von WINAPI und CALLBACK), in den 32-Bit-Versionen sind sie dagegen beide als __stdcall definiert. (Wenn Sie sich für die Details interessieren: Dieses durch zwei Unterstriche als nicht ANSI-gemäss gekennzeichnete Schlüsselwort teil dem Compiler mit, dass Optimierungen wie die Übergabe von Parametern in Registern des Prozessors unerwünscht sind und der Aufruf nach den Konventionen von Pascal geschieht.
Laut Wikipedia sind allerdings __stdcall und Pascal zwei verschiedene Konzepte. __stdcall von rechts nach links, pascal von links nach rechts.

War 1998 __stdcall tatsächlich das selbe wie die Konvention von Pascal? Oder ist das ein Fehler im Buch (In der Errata habe ich nichts gefunden)?
Freelancer 3D- und 2D-Grafik
mischaschaub.com
NytroX
Establishment
Beiträge: 364
Registriert: 03.10.2003, 12:47

Re: Calling Convention WinAPI - WINAPI, CALLBACK, __stdcall

Beitrag von NytroX »

Das Buch ist falsch.

Bei calling conventions macht eh jeder Compiler was er will, daher im Zweifelsfall immer auf die Herstellerangaben achten.
(Aber selbst die sind nicht immer richtig, aber in den letzten Jahren wurde da mehr drauf geachtet)

Hier die Angaben zu BCC (dem Borland Compiler für TurboPascal):
https://docwiki.embarcadero.com/RADStud ... ns_(BCC32)
"Pascal": [...] the parameters are pushed left to right [...]
"Standard Call": [...] parameters are pushed right to left [...]

Solange du keinen Compiler schreiben willst, sind die Details eigentlich egal. Wichtig ist nur zu wissen dass es sowas gibt und dass sie jeweils unterschiedlich sind.
Zu den Calling Conventions gehört allerdings nicht nur, was in welchem Register übergeben wird, sondern auch so Sachen wie RedZones und wann man ggf. Funktionen zur Stack-Erweiterung aufrufen muss (_chkstk), usw usf.
Benutzeravatar
starcow
Establishment
Beiträge: 527
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Calling Convention WinAPI - WINAPI, CALLBACK, __stdcall

Beitrag von starcow »

Alles klar, gut zu wissen! Danke für den Link!
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Antworten