COM 组件三个最基本的接口类 //VC6 中使用 COM 库的三种方法 COM 组件有三个最基本的接口类,分别是 IUnknown、IClassFactory、IDispatch
COM 法律规范规定任何组件、任何接口都必须从 IUnknown 继承,IUnknown 包含三个函数,分别是 QueryInterface、AddRef、Release
这三个函数是无比重要的,而且它们的排列顺序也是不可改变的
QueryInterface 用于查询组件实现的其它接口,说白了也就是看看这个组件的父类中还有哪些接口类,AddRef 用于增加引用计数,Release 用于减少引用计数
引用计数也是 COM 中的一个非常重要的概念
大体上简单的说来可以这么理解,COM 组件是个 DLL,当客户程序要用它时就要把它装到内存里
另一方面,一个组件也不是只给你一个人用的,可能会有很多个程序同时都要用到它
但实际上 DLL 只装载了一次,即内存中只有一个 COM 组件,那COM 组件由谁来释放
由客户程序吗
不可能,因为假如你释放了组件,那别人怎么用,所以只能由 COM 组件自己来负责
所以出现了引用计数的概念,COM 维持一个计数,记录当前有多少人在用它,每多一次调用计数就加一,少一个客户用它就减一,当最后一个客户释放它的时侯,COM 知道已经没有人用它了,它的使用已经结束了,那它就把它自己给释放了
引用计数是 COM 编程里非常容易出错的一个地方,但所幸 VC 的各种各样的类库里已经基本上把 AddRef 的调用给隐含了,在我的印象里,我编程的时侯还从来没有调用过 AddRef,我们只需在适当的时侯调用 Release
至少有两个时侯要记住调用 Release,第一个是调用了 QueryInterface 以后,第二个是调用了任何得到一个接口的指针的函数以后,记住多查 MSDN 以确定