问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

MFC中,什么是CALLBACK函数,什么是WINAPI函数,二者有什么区别和联系?

发布网友 发布时间:2022-12-18 13:09

我来回答

1个回答

热心网友 时间:2023-09-18 14:42

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 proceres and dialog proceres.

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

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的一个原因了。

参考资料:http://bbs.xml.org.cn/dispbbs.asp?boardid=61&id=27018

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请问我的网络一天了找个部门到现在没有解决请问我上哪投诉? 计算机具备哪几种功能? 计算机有哪些功能是什么 歌词中有丑姑娘的歌曲 驾照不年审会怎样 没开过车驾照年审会通过吗 本来白色的背心放入洗衣机清洗后就变成有黑色斑点 其他一起洗的衣物... ...衣服颜色保持鲜艳(主要是白色衣服洗几次感觉就有点颜色不亮丽了... 为什么登陆lol会叫你解绑 小姨子告诉我说,炒菜时记住这4个小技巧,就是比别人做的好吃 能治好强直性脊柱炎吗或控制病情发展【强直性脊柱炎】 BOOL WINAPI DllMain 函数是干嘛的 中间为什么加上 WINAPI 这是什么意思? Excel 什么是WinAPI-ExcelVBA程序开发 WINAPI - 概念 中秋思念妈妈的句子 win7键盘反应慢杀毒后就好了 怎样设置才能让win7的键盘不那么慢? 梦见亲人墓碑倒了,有水 相机多大内存够用? 山西银行和山西农村信用社利率 小学五年级跳远3.6米算远吗? 五年级蹲踞式跳远男生女生要跳多远达标 2020年6月1日安全带新规定是什么? 高校食堂社会化的利与弊 的辩论赛 ·食堂社会化是什么, 食堂社会化的利弊 高校食堂引入社会竞争利大于弊如何提问反方 食堂社会化是什么 80后经典老歌女歌手 复仇菇怎么画 超级玛丽的蘑菇都在哪? 超级玛丽奖命蘑菇 红糖姜水的简单做法 给每个孩子一颗温暖的心——致学生的一封信 搜狗五笔输入法为什么一重启就没了 大家好,我写了一点小说,但我没有电脑,可以在网上发表吗?有知道怎么在书城投稿的吗?谢谢! 怎么注册书城会员,而且我想给QQ书城投稿,怎么投啊,各位亲,帮忙啦 我在3G书城投稿,他让我分成签约。3G书城的分成签约靠谱吗?这是不是说我的小说超级烂呢? 怎样在腾讯书城投稿 如果给QQ书城投稿,版权是否会得到保护?给哪个网站投稿版权保护好? 电动滑板车可以上楼吗 电动滑板车在电梯里会爆炸吗 折耳猫吃什么软骨素好(折耳猫吃什么软骨素好一点) 折耳猫需要补钙吗 折耳猫没发病怎么预防 怎样减肥快又不伤身体? v9电池型号 开始学卖家具需要注意什么 抓绒外套加羽绒坎肩好看吗 无锡中微晶园电子有限公司怎么样? 中微晶园值得去吗 载流子和电子的区别