晃晃悠悠
isrobert
VC知识库BLOG
::
首页
::
新随笔
::
联系
::
聚合
::
登录
::
12 随笔 :: 0 文章 :: 34 评论 :: 0 Trackbacks
<
2007年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
留言簿(0)
给我留言
查看公开留言
查看私人留言
随笔分类
唉~终于批下来了。。。 (0)
(rss)
随笔档案
2007年11月 (2)
2007年5月 (2)
2007年3月 (3)
2007年1月 (5)
文章档案
相册
...... (1)
收藏夹
好文章 (0)
(rss)
相关链接
C 程序字号的修改
DirectX 图形、音频、视频,很详细了!
FLxyzsby的专栏
Haides
libpcap基础知识
vc编程经验总结
Windows中获取MAC地址的几种方法
WinPcap 教程
WMI
使用pcap编写自己的sniffer
博为 - WINDOWS下对音频的处理过程
博客登峰
周星星之BLOG
基于API的录音机程序
属性页
杨老师之Blog
清风雨
灵动生存 - DirectShow介绍
用Sniffer抓包分析以太网帧
搜索
最新评论
1. re: (ZT) Window下拖放操作Drag & Drop 全解析
请发份代码学习下。liwenruiabc@qq.com非常感谢!
--李文瑞
2. re: (函数)调用约定--- __cdecl和__stdcal
好东西,收藏了
--健康管理
3. Window下拖放操作Drag & Drop 全解析
您介绍的很好,不知道您是否能发送CListCtrlEx,支持OLE drag&drop,的程序代码参考和学习呢?我的电邮是:Forrest_Chi_2006@126.com.等待您的答复!
--Forrest_Chi
4. re: (ZT) Window下拖放操作Drag & Drop 全解析
楼主可以的,顶你
--cinbo
5. re: 木马编程DIY之注册表管理
挑战病毒呀。
--挑战杯
6. re: 木马编程DIY之注册表管理
命令行下,reg add,reg query也许更方便。
--sjdev
7. re: 木马编程DIY之注册表管理
写得好
--gaoqing000
8. re: (ZT) Window下拖放操作Drag & Drop 全解析
方便的话发份。代码研究下loswing@gmail.com
--loswing
9. re: (ZT) Window下拖放操作Drag & Drop 全解析
写得好
--gaoqing000
10. re: (函数)调用约定--- __cdecl和__stdcal
vc资料站:
http://www.vcmsdn.com/
对学习很有帮助的,可以上去
看看,或加群46138350,里面有高手可以请教的。
--maggie
阅读排行榜
1. 程序中控件实现随xp风格的改变而改变(2301)
2. (函数)调用约定--- __cdecl和__stdcal(2199)
3. 程序互斥~(2167)
4. ZT:音频处理的基本知识~(1896)
5. (ZT) Window下拖放操作Drag & Drop 全解析 (1834)
6. 20070126--函数指针的问题(1777)
7. ZT:VC下ADO开发实践之一(1747)
8. typeid(1654)
9. 20070125-单链表倒序算法 -------- 看到**的文章,自己想小试牛刀(1556)
10. 木马编程DIY之注册表管理(1320)
评论排行榜
1. 20070124-关于c,c++对函数的类型检查问题(8)
2. (ZT) Window下拖放操作Drag & Drop 全解析 (5)
3. 程序中控件实现随xp风格的改变而改变(4)
4. 程序互斥~(4)
5. 木马编程DIY之注册表管理(3)
6. (函数)调用约定--- __cdecl和__stdcal(3)
7. ZT:VC下ADO开发实践之一(2)
8. 20070126--函数指针的问题(2)
9. typeid(2)
10. 20070125-单链表倒序算法 -------- 看到**的文章,自己想小试牛刀(1)
(函数)调用约定--- __cdecl和__stdcal
调用约定(Calling convention)决定以下内容:函数参数的压栈顺序,由调用者还是被调用者把参数弹出栈,以及产生函数修饰名的方法。
上面这段话摘自
[BlueTopic]
的BLOG
采用__cdecl约定时,函数参数按照从右到左的顺序入栈,并且由调用函数者把参数弹出栈以清理堆栈。采用__stdcal约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,函数参数个数固定。由于函数体本身知道传进来的参数个数,因此被调用的函数可以在返回前用一条ret n指令直接清理传递参数的堆栈。__fastcall约定将函数的从左边开始的两个大小不大于4个字节(DWORD)的参数分别放在ECX和EDX寄存器,其余的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的堆栈。
(上面这段话摘自CSDN)
可见__cdecl和__stdcal之间的唯一区别在于返回时是由被调用者清理栈,还是由调用用者清理栈.
但是,这两种清理栈的方式,会对有什么影响呢?
很感谢
[jxb_memory]
的回答:
_stdcall与_cdecl两者之间的区别:
WINDOWS的函数调用时需要用到栈(STACK,一种先入后出的存储结构)。当函数调用完成后,栈需要清除,这里就是问题的关键,如何清除??
如果我们的函数使用了_cdecl,那么栈的清除工作是由调用者,用COM的术语来讲就是客户来完成的。这样带来了一个棘手的问题,不同的编译器产生栈的方式不尽相同,那么调用者能否正常的完成清除工作呢?答案是不能。
如果使用__stdcall,上面的问题就解决了,函数自己解决清除工作。所以,在跨(开发)平台的调用中,我们都使用__stdcall(虽然有时是以WINAPI的样子出现)。
那么为什么还需要_cdecl呢?当我们遇到这样的函数如fprintf()它的参数是可变的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行,因此,这种情况我们只能使用_cdecl。
到这里我们有一个结论,如果你的程序中没有涉及可变参数,最好使用__stdcall关键字
posted on 2007-05-10 09:48 isrobert 阅读(2199)
评论(3)
编辑
收藏
评论
#
re: (函数)调用约定--- __cdecl和__stdcal
2007-06-01 16:18
zc
如果是c的导出函数,用__stdcall会出错
#
re: (函数)调用约定--- __cdecl和__stdcal
2007-09-03 15:58
maggie
vc资料站:
http://www.vcmsdn.com/
对学习很有帮助的,可以上去
看看,或加群46138350,里面有高手可以请教的。
#
re: (函数)调用约定--- __cdecl和__stdcal
2008-05-27 11:53
健康管理
好东西,收藏了
标题
姓名
主页
验证码
*
内容
Remember Me?
登录
使用高级评论
Top
[使用Ctrl+Enter键可以直接提交]
Powered by:
Copyright © isrobert