__cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:
- 函数参数的压栈顺序
- 调用者还是被调用者负责吧参数弹出栈
- 产生函数修饰名的方法
压栈顺序 | 栈参数清理 | 函数修饰名称 | |
__stdcall | 从右向左 | 被调用函数 | |
__cdecl | 从右向左 | 调用者 | |
__fastcall | 前两个参数使用ECX和EDX寄存器传递, 剩下的从右向左 | 被调用者 |
_beginthread需要__cdecl的线程函数地址,_beginthreadex和CreateThread需要__stdcall的线程函数地址。 一般WIN32的函数都是__stdcall。