COM技术基础

参考:http://msdn.microsoft.com/zh-cn/library/ms172270(VS.80).aspx

1、COM和GUID

      COM对象的位置对客户而言是透明的,因为客户并不直接访问COM对象,客户程序通过一个全局标志符进行对象的创建和初始化操作。在COM规范中,这个全局标识符是一个128位的全局唯一标识符GUID,它基本上可以保证COM对象的唯一性。

     全局唯一标识符GUID(Globally Unique Identifier)是用来在COM中唯一的标识一个对象、接口、控件类或其他实体的。例如:COM对象的GUID称为CLSID(Class Identifier),对象的接口的GUID称为IID(Interface Identifier)。GUID是可以通过API函数CoCreateGUID()来产生。

2、COM接口

     从技术实现上讲,COM接口是包含了一组虚函数生命的数据结构。所谓虚函数声明,是指定义了函数的参数和返回值类型,没有函数的实现。这是为了遵循组件不能暴露任何内部实现的原则,这些函数不能在接口中实现,而是实现于该接口所在的组件中。这组成员函数的功能就是COM对象为客户提供的所有功能,客户程序利用这些函数获得COM对象的服务。接口只是指明了要做什么,但却没有任何的实现,而真正的实现可以通过接口找到。

接口的运行过程如下:

当客户程序创建COM对象后,会获得一个接口指针,这个指针实际上又指向另一个指针pVtable,它又指向了接口虚函数表(vitual function table,Vtable)。虚函数表中每一项为4个字节长的函数指针,每个函数指针与对象的具体实现连接起来。

3、IUnKnown接口

     COM的所有接口主要有两类:一类是由IUnKnown接口派生而来,一类又IDispatch接口派生而来。这两类接口的主要区别是接口函数的调用方式不同。如果有些语言不支持像C/C++那样的复杂数据结构和指针,则COM接口由IDispatch派生。一般用到的接口都由IUnKnown接口派生。

     在一个COM对象的所有接口中,必须有IUnKnown接口,如果没有这个标准接口,COM对象就不能正常运行。IUnKnown接口仅仅有QueryInterface(),AddRef(),Release()3个简单函数组成。客户程序可以通过QueryInterface()函数得到指向另一个接口的指针,继而可以使用这个接口指针访问真正感兴趣的函数,而Addref()和Release()函数则用来支持对象生命周期的管理。这样多个客户可以独立的使用同一个对象实例,只有当所有的客户都已经释放其引用时才删除这个对象,并且释放其所占用的内存。在这两个函数中,有引用COM对象的计数器。

4、COM组件注册

COM位置无关性的实现机制主要依赖于注册表。这也就是为什么一定要在使用之前对COM组件进行注册的原因。COM库在接到客户程序的请求后,会到注册表中检索COM对象的注册条目,并以此来定位COM对象。可以通过RegSvr32.exe进行注册。

原文地址:https://www.cnblogs.com/jyz/p/1257953.html