Skip to content

STDCALL


在过程声明中指定 stdcall 风格的调用约定

语法

vb
Sub name Stdcall [Overload] [Alias "alias"] ( parameters )
Function name Stdcall [Overload] [Alias "alias"] ( parameters ) [ Byref ] as return_type

说明

在过程声明中,Stdcall 指定过程将使用 Stdcall 调用约定。在 Stdcall 调用约定中,参数按照列出顺序的相反顺序(即从右到左)传递(压栈)。过程无需保留 EAXECXEDX 寄存器,并且必须在返回前清理栈(弹出所有参数)。

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 Function

end GeSHi

平台差异

  • 在 Windows 系统上,Stdcall 过程的内部/外部名称会添加 "@N" 修饰,其中 N 是参数列表的大小(字节数)。

与 QB 的区别

  • FreeBASIC 新增

另请参阅

  • Pascal, Cdecl
  • Declare
  • Sub, Function

返回 目录

基于 FreeBASIC 官方文档翻译 如有侵权请联系我们删除
FreeBASIC 是开源项目,与微软公司无隶属关系