1. COM 是Component Object Model (组件对象模型)的缩写。
2. COM 组件的产品形态是windows 下的 DLL 文件,与普通 DLL 不同的是,可以使用 regsvr32(win32) + 组件名称的方式注册至系统注册表中。
3. COM 组件具体实现借助于Active Template Library(活动模板库)。
4. 在使用 ATL 实现 COM 组件的过程中,比较重要的是维护好 COM 组件的引用计数,否则会造成内存泄露或程序宕掉。
5. 在引用计数中,每一个对象负责维护对象所有引用的计数值。当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,引用计数就递减。当引用计数到零时,该对象就将释放占有的资源。维护引用计数要了解一下知识点:
注意对IUnknown成员函数QueryInterface(),AddRef(),Release()的调用。
IUnknown: COM定义的每一个接口都必须从IUnknown继承过来,其原因在于IUnknown接口提供了两个非常重要的特性:生存期控制和接口查询。客户程序只能通过接口与COM对象进行通信,虽然客户程序可以不管对象内部的实现细节,但它要控制对象的存在与否。
QueryInterface:客户可以通过此函数来查询组件是否支持某个特定的接口。若支持,QueryInterface返回一个指向此接口的指针;否则返回值将是一个错误代码。
AddRef和Release实现的是一种名为引用计数的内存管理技术。引用计数是使组件能够自己将自己删除的最简单同时也是效率最高的方法。COM 组件将维护一个称做引用计数的值。当客户从组件取得一个接口时,此引用计数值增1。当客户使用完某个接口时,此引用计数值减1。当引用计数值为0时,组件可以将自己从内存中删除。当创建一个以后接口的另外一个引用时,客户也将会增大响应组件的引用计数值。
使用引用计数的简单规则:
1. 在返回之前调用 AddRef。对于那些返回接口指针的函数,在返回之前,应用相应的指针调用AddRef,包括QueryInterface及CreateInterface。这样当客户从这种函数得到一个接口后,它将无需调用AddRef。
2. 使用完接口后调用Release。再使用完某个接口后应调用此接口的Release函数。
3. 在赋值之后调用AddRef。将一个接口指针赋给另外一个接口指针的时,应调用AddRef。换句话说,在建立接口的另外一个引用之后应该增加响应组件的引用计数。
4. 在使用智能指针类时,不用考虑引用计数问题,对引用计数的操作都已经封装在智能指针类的内部了。例如CComVariant,CComPtr类。