1、常用场合
__stdcall:windows API默认的函数调用协议
__cdcel:C/C++、MFC默认的函数调用协议
__fastcall:适用于对性能要求较高的场合
2、函数参数压栈方式
__stdcall:函数参数从右至左压栈
__cdcel:函数参数从右至左压栈
__fastcall:函数参数从左开始不大于4字节的参数放入CPU和EDX寄存器,其余参数从右至左入栈
3、栈内数据清除方式
__stdcall:函数自己清理
__cdcel:函数调用者清理
__fastcall:函数自己清理
4、名字修饰(c语言)
__stdcall:编译后,函数名被修饰为:”_functionname@number”
__cdcel:编译后,函数名被修饰为:”_functionname”
__fastcall:编译后,函数名被修饰为:”@functionname@number”
(c++语言)
__stdcall:编译后,函数名被修饰为:”?functionname@@YG******@Z”
__cdcel:编译后,函数名被修饰为:”?functionname@@YA******@Z”
__fastcall:编译后,函数名被修饰为:”?functionname@@YI******@Z”
注:
1、_beginthread需要__cdecl的线程函数地址,_beginthreadex和CreateThread需要__stdcall的线程函数地址
2、一般WIN32的函数都是__stdcall。而且在Windef.h中有如下的定义:
#define CALLBACK __stdcall
#define WINAPI __stdcall
参考:
http://blog.sina.com.cn/s/blog_701526f40100lcy6.html
http://blog.youkuaiyun.com/kiki113/article/details/4971886