COM 技术入门基础知识
http://www.cppblog.com/suiaiguo/archive/2009/07/17/90354.asp
x
这几天在学习 COM 组件技术,网上看了很多教程,发现有一些很基础的东西基本都没有涉
及,下面我就结合网上的一些教程加上自己的体会来进行一些总结。
(1)COM 组件是什么?
COM 组件由以 Win 32 动态连接库(DLL)或可执行文件(EXE)形式发布的可执行代码所
组成。再向深入了看,以 C++为例,COM 组件实际上就是一些实现了特定接口的类,而接口
都是纯虚类。组件从接口派生而来。我们可以简单的用纯粹的 C++的语法形式来描述 COM 是
个什么东西:
class IObject
{
public:
virtual Function1( ) = 0;
virtual Function2( ) = 0;
.
};
class MyObject : public IObject
{
public:
virtual Function1( ){ }
virtual Function2( ){ }
.
};
看清楚了吗?IObject 就是我们常说的接口,MyObject 就是所谓的 COM 组件。切记切
记接口都是纯虚类,它所包含的函数都是纯虚函数,而且它没有成员变量。而 COM 组件就是
从这些纯虚类继承下来的派生类,它实现了这些虚函数,仅此而已。从上面也可以看出,COM
组件是以 C++为基础的,特别重要的是虚函数和多态性的概念,COM 中所有函数都是虚函数,
都必须通过虚函数表 VTable 来调用,这一点是无比重要的,必需时刻牢记在心。
(2) COM 组件有三个最基本的接口类,分别是 IUnknown、IClassFactory、
IDispatch。
COM 规范规定任何组件、任何接口都必须从 IUnknown 继承,IUnknown 包含三个函数,
分别是 QueryInterface、AddRef、Release。这三个函数是无比重要的,而且它们的排列顺
序也是不可改变的。QueryInterface 用于查询组件实现的其它接口,说白了也就是看看这个
组件的父类中还有哪些接口类,AddRef 用于增加引用计数,Release 用于减少引用计数。引
用计数也是 COM 中的一个非常重要的概念。大体上简单的说来可以这么理解,COM 组件是个
DLL,当客户程序要用它时就要把它装到内存里。另一方面,一个组件也不是只给你一个人用