STDCALL
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgStdcall
- 最后更新: 2022-10-31
在过程声明中指定 stdcall 风格的调用约定
语法
vb
Sub name Stdcall [Overload] [Alias "alias"] ( parameters )
Function name Stdcall [Overload] [Alias "alias"] ( parameters ) [ Byref ] as return_type说明
在过程声明中,Stdcall 指定过程将使用 Stdcall 调用约定。在 Stdcall 调用约定中,参数按照列出顺序的相反顺序(即从右到左)传递(压栈)。过程无需保留 EAX、ECX 或 EDX 寄存器,并且必须在返回前清理栈(弹出所有参数)。
Stdcall 不允许用于可变参数过程声明(即最后一个参数为 "..." 的过程)。
Stdcall 是 Windows 上的默认调用约定,除非明确指定了其他调用约定或由 EXTERN 块 之一隐含。Stdcall 也是 BASIC 语言和 Windows API 中使用的标准(或最常见)调用约定。
如果过程定义有一个声明(显式或默认指定调用约定),且定义中没有显式指定调用约定,则调用约定由声明隐含。
示例
start GeSHi
vb
Declare Function Example Stdcall (param1 As Integer, param2 As Integer) As Integer
Declare Function Example2 CDecl (param1 As Integer, param2 As Integer) As Integer
Function Example Stdcall (param1 As Integer, param2 As Integer) As Integer
' This is an STDCALL function, the first parameter on the stack is param2, since it was pushed last.
Print param1, param2
Return param1 Mod param2
End Function
Function Example2 CDecl (param1 As Integer, param2 As Integer) As Integer
' This is a CDECL function, the first parameter on the stack is param1, since it was pushed last.
Print param1, param2
Return param1 Mod param2
End Functionend GeSHi
平台差异
- 在 Windows 系统上,
Stdcall过程的内部/外部名称会添加"@N"修饰,其中N是参数列表的大小(字节数)。
与 QB 的区别
- FreeBASIC 新增
另请参阅
Pascal,CdeclDeclareSub,Function
返回 目录