WINAPI
函数的调用方式
- PASCAL调用方式,__stdcall(CALLBACK,WINAPI,PASCAL),使用PASCAL调用方式,函数在返回到调用者之前将参数从栈中删除,WinMain函数是由系统调用的,Windows系统规定由系统调用的函数都遵守PASCAL调用方式
- C调用方式,__cdecl,使用C调用方式,参数的删除是调用者完成的,VC中函数的缺省调用方式是__cdecl,也就是C调用方式
stdcall,CALLBACK,WINAPI
- 参数从右向左依次压入堆栈
- 由被调用函数自己来恢复堆栈
-
函数名自动加前导下划线,后面紧跟着一个@,其后紧跟着参数的尺寸
//push b 先压入第二个参数 //push a 再压入第一个参数 //call function 调用函数 //在编译时,此函数的名字被翻译为_function@8 int _stdcall function(int a, int b);
cdecl
decl调用方式又称为C调用方式,是C语言缺省的调用方式,它的语法为:
int function(int a, int b) // 不加修饰符就是C调用方式
int _cdecl function(int a, int b) // 明确指定用C调用方式
- 参数从右向左依次压入堆栈
- 由调用者恢复堆栈, 由于是由调用者来恢复堆栈,因此C调用方式允许函数的参数个数是不固定的,这是C语言的一大特色。
-
函数名自动加前导下划线
//push b 先压入第二个参数 //push a 在压入第一个参数 //call funtion 调用函数 //add esp, 8 清理堆栈 。。。。。需要熟悉一下esp寄存器的功能,建议看一下汇编有关的书,基本都有讲 //在编译时,此方式的函数被翻译成:_function