__stdcall、__cdecl、CALLBACK、WINAPI区别
2020-12-02 08:33
标签:dll callback winapi stdcall cdecl 情景一:先看下Windows开发下的使用: 从上面也可以看到在windows平台下WINAPI和CALLBCAK其实是一致的; 情景二:另外我们知道在使用dumpbin DLL符号名的时候,假设有个add函数,输出时会如?add@@YANHH@Z之类的,如果加上extern ”C“之类的字符,输出的函数符号就是之前定义的add函数名了,这里就牵涉到函数调用问题,因为不同的语言和编译器平台,约定不一样,比如说函数的形参,默认采用的是压入栈中,有些是从左往右压入,有些则是从右往左压入的,不同的标准是不一样,所以如果调用就会出现出错,必须要指明哪一种调用方式,以便编译器能够正确识别。 那么他们有什么区别呢? 1)首先说下,C调用标准采用的是__cdecl,采用的入栈顺序,。。。 而Delphi采用的是pascal调用标准,即标准约定stdcall,也是Windows默认使用的约定,也就是说在Windows平台下WINAPI、CALLBCAK、stdcall其实都是一致的 2)__stdcall与__cdecl是两种不同的调用约定,定义了函数参数入栈的顺序,由调用函数还是被调用函数将参数弹出栈,以及产生函数修饰名的方法 3)在Windows程序中,回调函数必须遵从__stdcall调用约定,所以使用的是CALLBACK,当然也可以直接使用__stdcall,主要是便于区分 注意:有关入栈顺序,记得前面在看嵌入式方面的书籍中有关压入栈的顺序讲解较多,主要他们使用汇编,必须将具体的参数压入有关寄存器,然后取指的时候可以一一对应,回头查找一下,再做深入的解释 __stdcall、__cdecl、CALLBACK、WINAPI区别,搜素材,soscw.com __stdcall、__cdecl、CALLBACK、WINAPI区别 标签:dll callback winapi stdcall cdecl 原文地址:http://blog.csdn.net/comwise/article/details/24838077LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
这里就有一个CALLBACK,转到定义看一下#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK __stdcall
#define WINAPI __stdcall
...
文章标题:__stdcall、__cdecl、CALLBACK、WINAPI区别
文章链接:http://soscw.com/index.php/essay/23229.html