关于作者

用户名:BigCadre
笔名:BigCadre
地区: 冰岛-雷克雅未克
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



数据库技术

网络技术

朋友的家

克隆链接

访问统计:
文章个数:39
评论个数:74
留言条数:2




Powered by BlogDriver 2.1

千金散尽还复来『全部文章』

 

既然没终点,回到原点,我想我已经不在乎!

文章

函数调用规范__cdecl和__stdcall的区别一目了然(表格形式) 转载

 

__cdecl

 

 

__stdcall

 

CC++程序的缺省调用规范

 

为了使用这种调用规范,需要你明确的加上__stdcall(或WINAPI)文字。即return-type __stdcall function-name[(argument-list)]

 

 

调用函数(Callee)返回,由调用者(Caller)调整堆栈。

 

调用者

    // call function

    // adjust stack

 

被调用函数

    // do work

    // return

 

调用函数(Callee)返回,由调用函数(Callee)调整堆栈。图示:

 

调用者

    // call function

 

被调用函数

    // do work

    // adjust stack

    // return

 

因为每个调用的地方都需要生成一段调整堆栈的代码,所以最后生成的文件较大。

 

 

因为调整堆栈的代码只存在在一个地方(被调用函数的代码内),所以最后生成的文件较小。

 

函数的参数个数可变(就像printf函数一样),因为只有调用者才知道它传给被调用函数几个参数,才能在调用结束时适当地调整堆栈。

 

 

函数的参数个数不能是可变的。

 

对于定义在C程序文件中的输出函数,函数名会保持原样,不会被修饰。

对于定义在C++程序文件中的输出函数,函数名会被修饰, MSDNUnderscore character (_) is prefixed to names. 我实际测试(VC4VC6)下来发现好像不是那么简单。

可通过在前面加上extern “C”以去除函数名修饰。也可通过.def文件去除函数名修饰。

 

不论是C程序文件中的输出函数还是C++程序文件中的输出函数,函数名都会被修饰。

对于定义在C程序文件中的输出函数,An underscore (_) is prefixed to the name. The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list.

对于定义在C++程序文件中的输出函数,好像更复杂,和__cdecl的情况类似。

好像只能通过.def文件去除函数名修饰。

 

 

_beginthread需要__cdecl的线程函数地址

 

 

_beginthreadexCreateThread需要__stdcall的线程函数地址

 

 

两者的参数传递顺序都是从右向左。

为了让VB可以调用,需要用__stdcall调用规范来定义C/C++函数。请参看Microsoft KB153586 文章:How To Call C Functions That Use the _cdecl Calling Convention

当你LoadLibrary一个DLL文件后, 把GetProcAddress取得的函数地址传给上面三个线程生成函数时,请务必确认实际定义在DLL文件的输出函数符合调用规范要求。否则,编译成Release版后运行,可能会破坏堆栈,程序行为不可预测。

VC中的相关编译开关:/Gd /Gr /Gz。另外,VC6中新增加的 /GZ 编译开关可以帮你检查堆栈问题。

我也是初学者,若有不对的地方、可以补充的地方,请指教。谢谢。 

- 作者: BigCadre 2005年10月16日, 星期日 15:33  回复(0) |  引用(0) 加入博采

论教育产业化之腐朽【转载 罗锡铭】
摘要:自人类有史以来便有了教育,教育是人类自身发展与繁衍的重要手段,人类的一切知识和技能、智力和体力及人的思想都是通过教育来发展和完善的。在人类的发展进程中,教育促进了生产力的发展,推动了人类社会的文明与进步。因此,教育是人类所特有的社会现象,是人类在其自身发展与繁衍的社会进程中永恒的、不可推卸和不可替代的社会责任。 教育随着生产力的发展而发展,随着阶级社会的交替而变迁,教育也是阶级服务的工具。当教育发展到今天,实行所为的"教育产业化",特别是基础教育的产业化,其实质是教育的腐朽 查看全文

- 作者: BigCadre 2004年08月5日, 星期四 20:46  回复(1) |  引用(0) 加入博采

教育产业化之我见【转载 马振海】
摘要:我不反对教育产业化,但是,我认为,我国的教育产业化已经走入了误区。 国家教育事业能否产业化,该不该产业化,见仁见智,众说不一。我认为,关键在于我们怎样理解教育产业化。如果把教育产业化简单地理解为办学收费,通过办学而盈利,创受教育者之钱财,在这种意义上教育是不应该产业化的。这是对教育产业化的一种误解。当前,我国中、高等教育普遍实行收取数额不低的学费,的确扩大了国民的教育消费需求,也使我国教育“产业化”了,但是这一改革措施既不能拉动我国的经济增长,也不利于发展我国的教育事业。眼下,我国的国立大学、民办大学成了教育资金筹集部门,学生之家长成为教育资金筹集对象,这种办学指导思想无论从理论上还是从道义上都是讲不通的。这是我国教育改革的一个误区,是一种不开放的改革。 查看全文

- 作者: BigCadre 2004年08月5日, 星期四 20:40  回复(0) |  引用(0) 加入博采

没有任何借NOExcuse![(美)费拉尔•凯普 著]
摘要:这本书也许大家看过,不还还是要在这里转载一下,欢迎大家畅所欲言。我个人认为作者观点有些片面,没有任何借口必须服从的东西---公理!!! 不辨是非的服从不光是对自己的不负责任,更是对人类文明的亵渎!!! 查看全文

- 作者: BigCadre 2004年07月26日, 星期一 11:52  回复(7) |  引用(0) 加入博采

Oracle OpenWorld 上海
摘要:Oracle OpenWorld大会是Oracle公司面向企业决策者、IT管理者、行业经理人和用户的主要会展活动。参加这一千载难逢的盛大活动,您将能够于今年7月里的一周之内在中国上海从Oracle管理人员、产品开发人员、Oracle客户以及行业专家那里获得行业洞察力。 查看全文

- 作者: BigCadre 2004年07月26日, 星期一 11:38  回复(0) |  引用(0) 加入博采

欢迎加入博客公社
博客中国与您共创美好生活,现在就开始您精彩的博客之旅吧。

- 作者: BigCadre 2004年07月26日, 星期一 10:45  回复(0) |  引用(0) 加入博采