分享
 
 
 

模块复用——c++类、dll和com

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

这篇文章只是对c++、dll和com的泛泛而谈,更为详细的内容请参考《com本质论》,这篇文章也算是《com本质论》第一章的读书笔记或总结。如有不对之处,希望大家批评指正。

在windows下使用c++编写代码的人代码复用的常用方式大概就是c++类、dll和com

一、c++代码重用的缺陷

以前的c++开发人员复用代码的方式大概就是获得一套.h和.cpp文件,然后把这些文件加入到自己的工程中编译、连接,最后生成exe文件。这种代码级的复用方式存以下的问题

1、c++程序员通常根据自己的需要修改别人提供的代码。开发者要使用代码,通常会根据源代码来理解代码的意图。更为老火的是,还要理解代码提供者的思路和编码风格

2、c++代码级复用导致了硬盘和内存空间的浪费

假如机器上有n个软件使用了类CA,在每个软件的存储空间中都会有class CA的一份编译生成的代码,在这n个软件同时执行时,会占用n×sizeof(CA)大小的内存空间

3、软件一经发布,除非重新编译整个软件,否则无法修改

假如发现了类CA存在一个bug,要修改CA的实现来修复这个bug,那么就只有重新编译整个软件。软件根本就不具备2进制的模块化特性。

二、如何解决以上问题————dll的引入

在window中,一个很好的技术就是动态链接库(dll),有了dll技术,客户可共享该dll的代码,这样在用户机器上无论有多少个软件使用该dll,都会只有一份该dll的拷贝。而dll提供给开发者的也只是.h文件,隐藏了代码的实现细节。

三、dll复用存在的问题

1、编译器、连接器的不兼容问题

为了支持重载,c++编译器任意修改函数名(名字改编,感兴趣的可参考《深入探索c++对象模型第4章——function语意学》),而且每个c++编译器修改函数名的方法通常都不相同。这个问题的一个解决方案是将函数声明extern “C”链接指示符,这样做的一个缺陷是:不能用extern “C”声明成员函数。另一个解决方案是修改DEF文件,这样可保证所有的编译器导出相同的函数名,可保证dll在链接时的兼容。但这还不能保证2进制结构的兼容性,由于c++标准并未规定程序运行时的状态,每个编译器可能有自己的一套处理方式,比如在做异常处理时,一个编译器抛出的异常,在另一个编译器中可能不能扑获到

2、dll致命的弱点——版本冲突问题

dll的版本问题是臭名昭著的。解决版本冲突问题的经典方法是重命名dll文件名(这也是mfc的解决方案,mfc42d….mfc42ud等)。

四、祭出法宝,面向对象的原则——接口和实现的分离

dll版本问题的关键在于c++的编译模型和对象之间的紧密耦合关系,c++编译模型要求客户需要了解对象的内存布局,以便为对象分配内存。该问题的根本解决之道是分离接口和实现。把实现封装在dll的内部,客户通过接口来访问实现。这样,在客户代码中不会包含复用模块的实现部分。

五、com的解决方案

com是严格分离接口和实现的,客户只能通过接口来访问组件的实现。保证了不把任何实现细节暴露给客户。在客户使用组件分配内存时,也只有com接口中的vptr指针。Com使用接口继承的方式分离接口和实现。而大多数编译器对vptr和vtbl生成的内存布局是一致的。这样就解决了编译器之间的不兼容关系。

当然,com的用处还很多。Com技术也很复杂,我也不想多说 了,一是因为我懒,二是因为我水平还很菜,《com本质论》是一本好书。学com一定要看。

最后,想谈谈目前的软件开发环境。由于.net的推出,很多人在问现在学习com还是否值得。看看目前的软件,ie,office,msn包括.net的核心,哪个不是用com搭建起来的,而且我们学习com,关键是它的设计思想,知其然而知其所以然,了解了其背后的设计动机,用com还是用dll都是一样的了,如果只是用用,不学也罢. 。dll只是com的一种发布形式而已。即使在其他平台,这种思想也是很有用的,在com中体现的是OO的思想——接口和实现的分离、开-闭原则、针对接口编程,甚至强迫你使用某些设计模式。我认为,这就是学习com的价值。。而且,研究atl的源码中对com的实现,也能学到一些实用技术和设计模式。而这些东西是永远不会过时的。。技术是在不断演化的,但新技术也是旧技术积累产生的。Wtl之父也建议在学习.net前学学com。实际上,在window平台上,com永远有它的一席之地。。。。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有