STDCALL

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » S » STDCALL

Syntax: [DECLARE] {SUB | FUNCTION} prozedurname STDCALL [OVERLOAD] [ALIAS "externerName"] [(parameterliste) ...] {AS rueckgabetyp} {CONSTRUCTOR [priorität]} [STATIC] [EXPORT]
Typ: Schlüsselwort
Kategorie: Bibliotheken

Die STDCALL-Aufrufkonvention ist die Standard-Aufrufkonvention für FreeBASIC und die Microsoft Win32-API.
Wird in der Deklaration keine Angabe zur Aufrufkonvention gemacht, benutzt FreeBASIC 'STDCALL'.

Angegebene Parameter werden von rechts nach links ( <- ) übergeben, der letzte angegebene Parameter wird also als erster auf den Stack gelegt. Die aufgerufene Funktion muss den Stack vor dem Rücksprung mit RET XX (Return, Anzahl Byte) ausgleichen.

STDCALL kann nicht mit variabler Argumenten-Anzahl (siehe ... ) verwendet werden.

STDCALL ist die Aufrufkonvention, die standarmäßig unter Windows verwendet wird, sofern keine andere Konvention explizit festgelegt oder durch einen EXTERN-Block impliziert wird. Es ist außerdem die gebräuchlichste Konvention in BASIC-Dialekten und in der Windows-API.

Beispiel 1:

#Include "fbgfx.bi"

'SCREEN 18,32
Asm
  push 0  '5. Parameter optional
  push 0  '4. Parameter optional
  push 0  '3. Parameter optional
  push 32 '2. Parameter Farbbits
  push 18 '1. Parameter Screenmodus
  call _fb_GfxScreen@20
End Asm

Die aufgerufene Funktion (im Beispiel '_fb_GfxScreen@20') nimmt die Werte vom Stack und bereinigt den Stack.
Der x86-Befehl RET (Return) erlaubt als Parameter einen optionalen Byte-Wert, der die Größe des abzubauenden Stacks angibt (RET 20).

Beispiel 2: Vergleich der verschiedenen Aufrufmöglichkeiten

Sub s StdCall (s1 As Integer, s2 As Integer)
  Print "StdCall ", s1, s2
End Sub
Sub c Cdecl (c1 As Integer, c2 As Integer)
  Print "Cdecl ", c1, c2
End Sub
Sub p Pascal (p1 As Integer, p2 As Integer)
  Print "Pascal ", p1, p2
End Sub

Asm
  push 2 '2. Parameter - s2
  push 1 '1. Parameter - s1
  Call s 'rechts nach links

  push 2 '2. Parameter - c2
  push 1 '1. Parameter - c1
  Call c 'rechts nach links
  Add esp, 8 'der Stack muss durch die aufrufende Funktion aufgeräumt werden

  push 1 '1. Parameter - p1
  push 2 '2. Parameter - p2
  Call p 'links nach rechts
End Asm

Sleep

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
DECLARE, CDECL, PASCAL, Module (Library / DLL)