WINAPI和CALLBACK这两个宏【zt】

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

WINAPI和CALLBACK这两个宏有什么区别呢?

_stdcall _cdecl _pascal _fastcall这些关键字是什么意思,有什么区别呢?

首先看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 FAR PASCAL in application callback routines such as window procedures and dialog procedures. 

再看看到底这两个宏的内容是什么吧

VC:WINDEF.h
#define CALLBACK    PASCAL //=_pascal,VC已经不支持直接使用_pascal了
#define WINAPI      CDECL //=_cdecl

BCB:windef.h
#define CALLBACK    __stdcall
#define WINAPI      __stdcall

引出了cdecl stdcall等一些可能很少见的关键字

那么cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?
非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是
压入堆栈的内容由谁来清除,调用者还是函数自己?
这些开关用来告诉编译器产生什么样的汇编代码。

下面把区别列表如下:

Directive Parameter order  Clean-up Passes parameters in registers?
 register  Left-to-right   Routine   Yes
 pascal   Left-to-right   Routine   No
 cdecl   Right-to-left   Caller    No
 stdcall   Right-to-left   Routine   No
 safecall  Right-to-left   Routine   No

简单说明:

__cdecl是C/C++和MFC程序默认使用的调用约定,也可以在函数声明时加上__cdecl关键字来手工指定。采用__cdecl约定时,函数参 数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。因此,实现可变参数的函数只能使用该调用约定。由于每一个使用__cdecl约定的 函数都要包含清理堆栈的代码,所以产生的可执行文件大小会比较大。__cdecl可以写成_cdecl。
        __stdcall调用约定用于调用Win32 API函数。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函 数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参 数的堆栈。__stdcall可以写成_stdcall。
        __fastcall约定用于对性能要求非常高的场合。__fastcall约定将函数的从左边开始的两个大小不大于4个字节 (DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。__fastcall可 以写成_fastcall。 


·特别说明
1. 在默认情况下,采用__cdecl方式,因此可以省略.
2. WINAPI一般用于修饰动态链接库中导出函数
3. CALLBACK仅用于修饰回调函数
4. 你可能已经发现,VC下和BCB下对WINAPI的定义不同,那么你至少理解了
   为什么不能直接从BCB下调用VC的dll的一个原因了。

ROS机器人开发-第 02 章 开源的边界:哪些能抄,哪些要自己造 逆向任何产品的第一步不是拆东西,而是。这一章就是干这件事:Microduck 到底开源了什么、没开源什么、官方为什么这么说、复刻仓库自己是怎么栽了跟头又纠正过来的。边界划对,后面 34 章才不会在"这个件到底有没有官方资料"上反复打转。imu_to_dxlmicroduckelec_图 2-1 15 个部件沿运动链炸开的爆炸图(由 MJCF 自动渲染,每个部件标注名称与质量)。这张图本身就是"软件全开"的产物:没有官方装配图,复刻仓库用仿真模型自己画了出来。 阅读详情

相关推荐

Callback函数详解

http://shiwawa.blog.hexun.com/9925417_d.html 一,回调函数我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便符合逻辑,那么它的内在机制如何呢,怎么定义呢?它其它函数(比如钩子函数)有何不同呢?使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(

blueblood_jing的专栏 3475

C++ CALLBACKWINAPI两个的含义?

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

weixin_34233421的博客 561

cocos2dx的CC_CALLBACK是个什么

coco2dx看了段时间了,但是期初对于CC_CALLBACK这个只会用不理解是什么意思,今天一探究竟。 先来看源码CC_CALLBACK_1的定义,其他的一次类推。 #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__V

麻花 891

回调函数 callback

简介 对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为...

261

回调函数函数指针

  什么是回调函数简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。为什么要使用回调函数   因为使用回调函数可以把调用者被调用者分开,调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。回调函数就好像是一个

tina02347的专栏 581

UVM之callback

在UVM验证平台中,callback的最大用处就是提高验证平台的复用性。很多情况下,我们期望在一个项目中开发的验证平台能够用于另一个项目。但是,通常来说,完全复用是非常难实现的,两个不同的项目之间或多或少有一些差异。如果把两个项目不同的地方使用callback来做,而把相同的地方写成一个完整的env,这样复用时,env可以完全的复用,只要改变相关的callback即可。 callback简介 先来看一个最贱的callback函数。前面介绍过的mac_trransaction为例: 这个transacti

weixin_44969124的博客 1061

__cdecl

cdecl、pascal、stdcall、fastcall等修饰符号到底什么意思呢?非常简单,就是关于堆栈的一些说明,首先是函数参数压栈顺序,其次是压入堆栈的内容由谁来清除,调用者还是函数自己?这些开关用来告诉编译器产生什么样的汇编代码。 下面把区别列表如下:Directive Parameter order  Clean-up Passes parameters in registers

笔记小筑 1923

WINAPICALLBACK两个有什么区别

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

Kevin's Blog 1027

关于LPSTR_TEXTCALLBACK的机制

 LPSTR_TEXTCALLBACK 是如何请求字符串的?   这是列表控件的一种机制,如果把一个Item(或subITem)的文字设置为LPSTR_TEXTCALLBACK,当列表控件需要显示这个文字时会向其父控件发LVN_GETDISPINFO消息,父控件必须响应这个消息并返回要显示的文字。 你可以在MSDN中输入LVN_GETDISPINFO查看详细的说明。 这就是虚拟化C

jia_xiaoxin的专栏 5546

C++中回调函数(CALLBACK)初探

C++中回调函数(CALLBACK)初探 简介 对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们

《好好先生》专栏 3088

回调函数

简介  对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。   什么是回调函数?  简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。  为什么要使用回调函数

1153

Callback

SV中的回调(callback)明确了定义方法的规则,并且指定了一个方法用来回调已经定义的该方法;简而言之就是,被调用的方法就是回调方法(callback method),调用回调方法的方法称为回调勾(callback hook),回调方法一般是虚方法(dummy method),一般通过继承来进行覆盖重写. 我们来看回调方法是如何工作的: 在上面的图中,temp()方法就是回调勾,callback_1()callback_2()方法是回调方法,也就是在用户调用temp()方法的时候,callback_

weixin_43560853的博客 1208

C语言中callback回调函数,C++回调函数(callback)的使用

什么是回调函数(callback)模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应。那么我们就把foo称为回调函数。例子:回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,...

weixin_30411455的博客 5829

WINAPICALLBACK两个说开去- -(转)

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

FlowShell的专栏 1384

基于GTK的简易MFC对话框兼容层 -- MfcToGTK

本文介绍了一种将Windows MFC对话框程序移植至Linux的轻量级兼容方案。通过解析MFC资源字符串,利用GTK库实现窗口控件的动态创建与布局,结合自定义CDialog基类CStringW等MFC兼容类型,使原有基于MFC的测试工具在少量修改后即可在Linux上编译运行。该方案支持静态文本、编辑框、按钮、复选框等常见控件,并实现了模态对话框、数据交换(DDX)及文件选择对话框等功能,有效降低了跨平台移植成本。

lif12345的专栏 197

MFC CPtrArray的用法

CPtrArray是,在,专门用来存放。你刚才看同事手写的那个CPtrArray目标一模一样,同事 2004 年就是模仿 MFC 这个类手写的简易版本。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 234
上一篇: 微软老员工分享面试经历[转贴]
下一篇: 将创建的程序窗口始终在桌面顶端 Always On Top
mejy
博客等级 码龄21年 12粉丝 156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值