Essential COM
--------------------------------------Chapter1 COM是一个更好的C++----------------------------------------------
C++的编译和链接模型:
C++编译模型要求客户的编译器必须能够访问与对象的内存布局有关的所有信息,这样才能构造类的实例,或调用类的非虚成员函数。这些信息包括对象的私有和公有成员的大小和顺序。
影响c++组件成为客户独立的组件软件的因素:
1、符号名字(名字改编)(编译链接阶段)
2、语言的特征(如异常、虚基类、RTTI)(运行阶段)
3、
每个编译器厂商对RTTI的实现也不相同。?
可重用的二进制组件结构:
客户和组件之间的二进制耦合关系,指客户必须知道组件中对象的内存结构。
二进制接口:
前提:某个给定平台上,所有的c++编译器都实现了同样的虚函数调用机制。
要求:类定义没有数据成员、并且至多只有一个基类。
使用dll是为了保持c++类库的模块化特征。
如果没有二进制标准(比如com),当老版本客户使用新版本dll时,因为老版本客户以老版本lib的信息申请内存给新版本dll的构造函数来创建对象,会造成因为内存情况(对象大小、结构等)的差异而出现运行时错误。
dll中有其导出表(引出表,export list)。
dll的lib是导入库,lib不包含实际代码,只包含dll文件名和导出符号。在链接导入库(引入库)时,会在可执行程序中调用导入库符号的地方安放存根,在运行时由装载器动态装载dll,把导入符号解析到对应内存位置。
存根:存在于应用程序中的,在运行时用来定位其他模块(如dll)某个内存地址的记号。
不同的c++编译器厂商对重载函数可能会采用不同的名字改编方案,以适应现有的C链接器。
由于dll的导入库lib和dll的导出符号表使用生成dll的编译器的名字改编方案,其他使用不同名字改编方案的客户程序将不能成功链接lib。
extern "C"用来修饰全局函数(或变量),不能消除成员函数的名字改编问题。
DEF(Module Definition File)文件可以把dll的导出符号名在lib(导入库)中定义不同的导入符号名。这样就可以实现为不同的客户编译器订制导入符号。从而可使任何一个厂商编译器都能获得与dll在链接层次上的兼容性。
采用句柄类实现接口和实现的分离。即在接口类中包含一个实现类的指针,接口类随实现类一起编译(如在一个dll中),所以不会导致new操作出现错误。
而接口的内存结构不会改变。
接口类相当于客户和实现类之间的二进制防火墙。
句柄类没有解决编译器、链接器兼容性问题。
虚函数表:
编译器为每一个包含虚函数的类生成的静态函数指针数组。
使用虚析构函数会破坏接口类的编译器独立性,因为虚析构函数在vtbl中的位置随编译器的不同而不同。所以,解决对象析构的一个可行办法是在接口类中增加一个虚函数Delete(),以便可以调用到派生类的实现,并可以删除掉对象的完整结构。
使用dll导出抽象基类的方法,通常增加一个创建实现类的全局函数,用来导出创建实现类对象的方法。
*(FARPROC *)&pfnCreate = GetProcAddress(h, szFnName);//FARPROC?
修改接口类(增加方法):
通过在接口类最后增加新函数的方法,虽然可以解决老客户对新接口的兼容性。但新客户对老版本dll(老接口)的使用,依然会导致崩溃。修改方法有两种:
1、定义新接口扩展原接口,并让实现类实现(继承)新接口。并通过RTTI(dynamic_cast<INewInterface*>pInterface)使客户调用时可以分辨是非支持新接口。
2、增加新接口,让实现类通过多继承实现多接口。仍然使用RTTI(同上)获取到新接口。
com实现了组件内对象的二进制结构和外部客户的无关性。
让单个对象暴露多个接口,通过RTTI实现运行时对象的接口类型识别。
使用引用计数的方式,在组件内部管理对象的生命期,从而避免客户调用对象的析构函数,(虽然有通过增加普通虚函数接口来避免直接调用析构函数的方法)。也有利于组件对对象实现细节的封装。
Essential COM相关推荐
- WinRT界面控件Essential Studio上如何选择时间范围
本文主要说明如何在界面控件Essential Studio for WinRT(XAML)中如何实现时间范围选择,要实现这个可以参考下面的步骤: 1.从项目中打开"添加引用"窗口. ...
- Microsoft Security Essential: 微软安全软件
Microsoft Security Essential: 微软安全软件 这个杀毒软件终身免费 转载于:https://www.cnblogs.com/sky-heaven/p/5307564.htm ...
- 《Essential C++》读书笔记 之 泛型编程风格
<Essential C++>读书笔记 之 泛型编程风格 2014-07-07 3.1 指针的算术运算(The Arithmetic of Pointer) 新需求1 新需求2 新需求3 ...
- Essential Studio for mobile MVC如何创建一个Razor应用程序平台
在界面控件Essential Studio for mobile MVC中创建一个Razor应用程序平台,需要执行下面的步骤: 1.在文件菜单中点击新建项目,这个样子将会弹出一个新建项目对话框,如下图 ...
- Essential C++中文版 前言
天啊,这本书竟是如此轻薄短小.我真想大叫一声"哇欧"!C++ Primer 加上索引.扉页.谢词之后,厚达1237 页,而此书却只有薄薄276 页.套句拳击术语,这是一部" ...
- Essential Studio for mobile MVC中2种添加移动图表到MVC3 ASPX应用程序中的方法
在Essential Studio for mobile MVC中有两种方式可以实现添加移动图表到MVC3 ASPX应用程序中.如下: (1)使用生成器 以下的步骤是解释如何使用生成器图表的添加到应用 ...
- MVC界面开发包Essential Studio for ASP.NET MVC发布2017 v3丨附下载
2019独角兽企业重金招聘Python工程师标准>>> Essential Studio for ASP.NET MVC控件包是一个原生的MVC界面开发包,它包含了几乎所有企业级We ...
- scrum回顾_沙龙回顾 | 大规模敏捷框架-Essential SAFe介绍
作者:袁翠 2019年1月20日,这是一个周日的晚上,尽管如此,来参加沙龙的人还是不少,与其在家无所事事,不如来一场知识的火花碰撞. 按照惯例,先是进行自我介绍.如果说这次自我介绍与以往有任何不同的地 ...
- mega_[MEGA DEAL] 2018 Essential JavaScript编码捆绑包(96%折扣)
mega 学习世界上最重要的Web开发语言的终极指南(超过29小时,超过900页!) 嘿,怪胎, 本周,在我们的JCG Deals商店中,我们提供了另一个超值优惠. 我们将在2018 Essentia ...
- 移动界面控件Essential Studio for Mobile MVC网格控件解析
移动界面控件Essential Studio for Mobile MVC是Syncfusion公司旗下一款企业级的用于移动应用开发的界面控件,整个套包中包含了grids.charts.gauges. ...
最新文章
- 技术12期:如何设计rowkey使hbase更快更好用【大数据-全解析】
- 基于docker搭建svn-server
- 补第一阶段冲刺站立会议1(应发表日期5月13日)
- seaborn.FacetGrid
- Ubuntu上的samba共享文件安装配置
- 在中国做操作系统研发 20 年是种什么体验?
- java小程序显示多种按钮_微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能...
- 学习Coding-iOS开源项目日志(二)
- linux外接NetApp存储,netapp linux iscsi 实现
- pair用法 lower_bound upper_bound
- 匹配问题——匈牙利算法
- 全流程+讲解+避坑指南 第一次使用vulhub搭建漏洞环境
- Web安全工程师成长路线
- 《解惑》1棉花糖实验、意志力、延迟满足感?
- 不得不说说微信钉钉后端亿级用户架构那些事
- 天龙八部服务端Lua脚本系统(转)
- android11obb,exagear安卓11数据包obb合集版
- 《用户行为画像》学习(1-4章)
- 领峰:限价建仓怎么进行,有什么好处呢?
- 教你代码实现抢红包功能