COM教程(0-序章)

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++多继承技术。









你可能感兴趣的:(COM教程(0-序章))