函数的调用规则

microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。调用约定可以通过工程设置:Setting...\C/C++ \Code Generation项进行选择,缺省状态为__cdecl。

__cdecl

所谓的C调用规则。按从右至左的顺序压参数入栈,由调用者把参数弹出栈。切记:对于传送参数的内存栈是由调用者来维护的。返回值在EAX中。比如printf。格式为_functionname

__stdcall

_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中。按从右至左的顺序压参数入栈,由被调用者把参数弹出栈。切记:函数自己在退出时清空堆栈,返回值在EAX中。格式为_func@12(后者是参数的总字节数)

__fastcall

主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。返回仍然通过EAX。

__pascal

这种规则从左向右传递参数,通过EAX返回,堆栈由被调用者清除

__thiscall

仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定