Aufrufdeklarationen in Delphi
register
Standardkonvention für Funktionen in Delphi, wenn nicht explizit anders deklariert. Dabei werden die Parameter wie bei pascal in der Reihenfolge ihrer Deklaration zuerst in die Register EAX, EDX, ECX und eventuell verbleibende auf den Stack geschoben. Parameter, die nicht in Register geschoben werden, sind Real-Typen und Methoden-Zeiger.
pascal
Existiert eigentlich nur für Abwärtskompatibilität und wurde meines Wissens nach von Windows 3.x (16bit) standardmäßig benutzt. Hier wird nichts in Register sondern alles auf den Stack geschoben.
cdecl
Diese Deklaration ist eigentlich für den Import von C(++) Funktionen aus DLLs da. Das besondere ist, daß eine solche Funktion eigentlich eine beliebige Anzahl von Parametern entgegennehmen kann, da der Aufrufer (i.e. Compiler/Linker) verantwortlich ist, die Parameter auf dem Stack zu platzieren. Unter Delphi ist es mit der variablen Parameteranzahl dann aber auch schon vorbei17. Es soll nur als Hinweis dienen. Parameter werden entgegengesetzt ihrer Deklaration auf den Stack geschoben.
stdcall
Diese Aufrufkonvention wird sowohl von (fast?) allen
Win32-
API-Funktionen, als auch von der NT-Native
API verwendet. Auch VB/VBA kennt diese Aufrufkonvention (und zwar als einzige der hier aufgeführten!). Sie ist also durchaus für eigene DLLs zu empfehlen. Die Parameterübergabe erfolgt ebenfalls entgegengesetzt der Reihenfolge ihrer Deklaration auf den Stack.
safecall
Diese Konvention wird fast ausschließlich von Interface-Methoden bei der
ActiveX-Programmierung verwandt. Im Großen und Ganzen entspricht sie am ehesten stdcall. Näheres ist mir nicht bekannt.
Der große Unterschied zwischen den Aufrufkonventionen liegt im Endeffekt darin, daß sie zum Beispiel String-Parameter verschieden behandeln. Gleiches gilt für out, var und const Parameter, die ebenfalls von den verschiedenen Aufrufkonventionen verschieden behandelt werden.