调用约定

WinMain函数的原型:

int WINAPI WinMain(

    HINSTANCE hInstance,

    HINSTANCE hPreInstance,

    LPSTR         lpCmdLine,

    int              nCmdShow

);

WINAPI是这样定义的:
#define WINAPI      __stdcall

在VC6.0下生成的WinMain函数,实际上是:

int APIENTRY WinMain(

    HINSTANCE hInstance,

    HINSTANCE hPreInstance,

    LPSTR         lpCmdLine,

    int              nCmdShow

);

APIENTRY 这个定义为:

#define APIENTRY    WINAPI

所以归根到底都是 __stdcall,这个是什么东西了?这里解释一下:

__stdcall一种调用约定(调用函数时候的一种约定),其他的调用约定有:

__cdecl 和 __fastcall

调用约定将决定一下内容:它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。
WIN32API使用的是__stdcall调用约定

标准C,C++使用的是__cdecl调用约定

__stdcall调用约定:函数的参数自右向左压栈,被调用的函数在返回前清理传送参数的内存栈

__cdecl调用约定:每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的调用约定

猜你喜欢

转载自rainymay.iteye.com/blog/1182779
今日推荐