一个COM对象必须实现IUnknown接口所规定的功能,即生命期管理和运行时类型转换。
(1)基本IUnknow功能
对象的生存方式可以是堆存储、栈存储以及全局存储,同时COM还提供了一种被聚合的生存方式。生存方式不同,AddRef、Release和QueryInterface的实现方式就不同。比如:对于堆方式,Release要在引用计数归零时负责释放堆空间,而栈以及全局方式则不必;对于聚合方式,AddRef、Release以及大部分的QueryInterface调用要委托给外部对象。
为了达到对象的逻辑功能与其生存方式的分离,COM把对IUnknown基本功能的实现推迟到类层次结构的最底层,即CComObject(或它的其他伙伴)处。
CComObjectRootBase为CComObject的实现提供原材料的支持,如提供引用计数变量、基本的接口查询机制等,它是一个“功能集中类”。
(2)套间安全支持
根据对象所处的套间类型,对象功能的实现需要不同的同步支持。对于单线程套间对象,由COM库来保证访问的同步;而对于多线程套间对象,需要自己来同步调用。为了使套间安全支持与逻辑功能分离,ATL提供了一组提供线程安全操作支持的特征类(traits类)—— CComSingleThreadModel及其伙伴。它们提供了对一个LONG变量“恰好线程安全”的增减操作,以及跟套间类型匹配的CriticalSection功能类。
ATL同时提供了CComObjectRootEx模板类,它以某种ThreadModel特征类作为参数,提供对引用计数“恰好线程安全”的操作,并且提供了一个用于对象同步的锁。
PS:“恰好线程安全”的操作的意思是:对于需要线程同步的对象,提供win32 CriticalSection支持;对于不需要的对象,则什么也不做。
posted on 2007-04-06 11:46
michael 阅读(1371)
评论(0) 编辑 收藏 引用 所属分类:
心得