COM(Component Object Model,组件对象模型
(0)从dll到com
问题是,不同语言,不同编译器产生的二进制代码如何交互
还有dll升级问题。一个程序更新版本更改了dll的版本,另外一个程序怎么办?这就是所谓的dll hell
(1)接口定义语言(IDL
利用VS中自带的MIDL.exe编译器,其可以解析IDL文件,并产生C/C++头文件
几乎每个com方法都会返回一个HRESULT类型的错误号。为32为整数
每个com接口必须有两个IDL属性。[object]属性是必须的,他说明该接口定义的是com接口,而不是DCE风格的接口。第二个为接口的实质名字,如下所述:为了消除com接口之间的可能的名字冲突,所有com接口在实现的时候都被分配了一个二进制名字(GUID),包含32个16进制数字
(2)com组件</p><p>实际上是一个c++类,而且其接口都是纯虚类
class IObject //纯虚类,只包含虚函数,不包含任何成员变量 { public: virtualFunction1(...) = 0; virtualFunction2(...) = 0; }; classMyObject : public IObject { public: virtualFunction1(...){...} virtualFunction2(...){...} };
com组件有三个最基本的接口类:IUnknown、IClassFactory、IDispatch。
COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包含三个函数,分别是 QueryInterface、AddRef、Release。
QueryInterface用于插叙组件实现的其他接口,Addref用于引用计数,方便com组件知道何时应该释放自己占有的资源,release用于释放com组件
IClassFactory用于创建一个com组件
IDispatch称为调度接口。用于对除了c++其他语言的兼容,将每一个函数和每一个属性都进行编号,方便客户程序的调用。IDispatch的主要函数是Invoke,客户程序调用它,再有Invoke调用响应的函数。
(3)com组件和注册表
记录组件中的GUID。有了注册表,程序就不需要知道目标操作系统中的dll文件名,位置,和版本信息。而只需要对注册表进行查询。当版本进行升级的时候,可以简单通过更改注册表信息转到新版本的dll
(4)其他需要知道的内容:
封装:接口和实现分离
组件和对象:组件是模块重用,而对象是代码重用,比较流行的组件模型就是本文所接受的com/dcom
OLE:(对象链接与嵌入)商标名称,架构在com之上,用于程序之间的数据交换和对象交换
ActiveX:OLE的新一代商标名称。比较常见的用法是将其插入到其他程序或WEB网页中。网页中的activeX组件需要被用户浏览时,浏览器会自动下载并提示客户安装。COM是其最核心的技术。
ATL:ACTIVE TEMPLATE LIBRARY 是c++的模板库,用于加快com,在ATL产生之前,开发com组件的方法主要有使用com sdk 或者通过MFC对com的支持.ATL是com开发应用尽可能的自动化。ATL的基本技术包括com技术,c++模板类技术,c++多继承技术。