__stdcall、__cdecl、CALLBACK、WINAPI区别

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

情景一:先看下Windows开发下的使用:

LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
这里就有一个CALLBACK,转到定义看一下
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK    __stdcall
#define WINAPI      __stdcall
...

从上面也可以看到在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,主要是便于区分

注意:有关入栈顺序,记得前面在看嵌入式方面的书籍中有关压入栈的顺序讲解较多,主要他们使用汇编,必须将具体的参数压入有关寄存器,然后取指的时候可以一一对应,回头查找一下,再做深入的解释

CALLBACKWINAPI、_stdcall、_cdecl的意义与区别 CALLBACKWINAPI、_stdcall、_cdecl的意义与区别WINAPICALLBACK、是_stdcall的宏,微软件这样规定的,是根据字面意思为了方便区分。 #define CALLBACK __stdcall #define WINAPI __stdcall   调用约定起因: 因为不同的语言编译器平台,约定不一样,比如说函数的形参,默认 阅读详情

相关推荐

__stdcall、__cdeclCALLBACK 几种函数修饰符

CALLBACK == WINAPI ==__stdcall 实际上就是一种调用模式,就是约定由调用函数来自行解决压栈参数,同 pascal 调用。回调函数只能是类的静态成员函数或是类外定义的全局函数 #define CALLBACK __stdcall #define WINAPI __stdcall #define WINAPIV __cdecl #define A...

iteye_8029的博客 334

java通过JNA调用DLL文件(包含回调函数的实现)

JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架。非常强大、易用。其中JNA是对JNI的封装,能让java使用者更好的使用本地的动态库 一、JNA与JNI的比较 JNI: JNI允许Java代码其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C++的过程,注意写...

Mr.小强的博客 1万+

Delphi stdCall意义

1、此代码所在单元是个库,可被别的应用来调用,像SysUtils、DateUtils、Classes等单元一样,都是为将来的无穷无尽的应用提供服务的。 2、此代码还可能出现在library的工程中,即动态链接库(.dll文件),最后会有export HInitRSCCTL的语句,这样,别的应用程序就能动态链接该库,并调用该函数。相比而言,1中所述为静态链接。 DLL调用协定,是一个参数

孤独剑的专栏 6843

WINAPICALLBACK这两个宏有什么区别呢?还关于stdcallcdecl区别

结果对于我这样一个普通程序员,估计那么点开销,不会去关注!关于需要Dll导出的class,需要加特别的API的宏。 WINAPICALLBACK这两个宏 _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦WINAPI ·Use in place of FAR PASCA

sh_chenjian的专栏 1069

关于winapiCALLBACK,_stdcall _cdecl _pascal等的分析与归纳理解

WINAPICALLBACK这两个宏有什么区别呢? _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢?   首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exp

xd1103121507的专栏 761

WINAPICALLBACK区别

WINAPICALLBACK区别[转] _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported A...

aixi8485的博客 424

函数调用中__cdecl与__stdcall区别

转载地址:https://www.cnblogs.com/sober/archive/2009/09/01/1558178.html 在学习C++的过程中时常碰到WINAPI或者CALLBACK这样的调用约定,每每觉得十分迷惑。究竟这些东西有什么用?不用他们又会不会有问题?经过在网上的一番搜寻以及自己动手后,整理成以下的学习笔记。 1.WINAPICALLBACK 其...

路漫漫其修远兮 498

MFC中CALLBACK函数 WINAPI函数的区别

凡是由你设计却由windows系统呼叫的函数,统称为callback函数。某些API函数要求以callback作为你参数之一。如SetTimer,LineDDA,EnumObjects。   回调函数是由开发者按照一定的原形进行定义的函数(每个回调函数都必须遵循这个原则来设计)  例如:  ----------------------------------------   BOOL CALL

wangjiechen的博客 1218

MFC中CALLBACK,WINAPI区别联系

首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported API entry points, you can use this for your own APIs. CALLBACK ·Use in place of F

叮叮福 872

WINAPICALLBACK这两个宏有什么区别呢?

<br />WINAPICALLBACK这两个宏有什么区别呢?<br /><br />_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢?<br /><br /><br />首先看MSDN里给出的解释,不过有些语焉不详哦<br /><br />WINAPI <br />·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported API ent

Dolly2012的专栏 712

C++ CALLBACKWINAPI两个宏的含义?

在编程时,也许你会看到函数声明或定义中会出现CALLBACKWINAPI两个宏。其实,它们也是__stdcall的代名词。看windef.h中的内容: #define CALLBACK __stdcall #define WINAPI __stdcall __stdcall是调用类型.调用类型有:__fastcall、__cdecl、_...

weixin_34233421的博客 561

CALLBACK, WINAPI, AFXAPI函数调用方式

原文出自:http://patmusing.blog.163.com/blog/static/13583496020103233446784/   1. CALLBACKWINAPIAFXAPI到底是什么?它们分别在什么地方被定义的? 在头文件windef.h中,CALLBACK, WINAPI, APIENTRY …… #define CALLBACK  __stdcall

zxs的专栏 903

深入体会__cdecl与__stdcall

在学习C++的过程中时常碰到WINAPI或者CALLBACK这样的调用约定,每每觉得十分迷惑。究竟这些东西有什么用?不用他们又会不会有问题?经过在网上的一番搜寻以及自己动手后,整理成以下的学习笔记。 1.WINAPICALLBACK     其实这两者在Windows下是相同的,在windef.h中定义如下: Code #ifdef _MAC #define CALLBACK

skiing_886的专栏 701

调用约定CALLBACK

VC中涉及到调用约定的概念,特别是回调函数CALLBACKWinAPI等。         这些其实都归结到调用约定上,VC中默认使用的时cdecl的C语言调用约定,而CALLBACK,WINAPIstdcall即PASCAL调用约定。这两种约定在定义参数传递顺序及堆栈清楚方面有些差异。DELPHI采用的也是PASCAL约定,因此用DELPHI封装的函数在VC中调用时最好指定其约定是stdc

zqckzqck的专栏 1169

WINAPICALLBACK这两个宏有什么区别

WINAPICALLBACK这两个宏有什么区别呢? _stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢? 首先看MSDN里给出的解释,不过有些语焉不详哦 WINAPI ·Use in place of FAR PASCAL in API declarations. If you are writing a DLL with exported AP

ysr1980的专栏 1129
上一篇: 动态链接库DLL
下一篇: VC/MFC开发中的句柄HWND
comwise
博客等级 码龄15年 58粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值