该类处理聚合和非聚合对象的对象引用记数管理。对于非聚合对象它拥有对象的引用记数
对于聚合对象它拥有一个指向外部unknown的指针。对于聚合对象来说,CComOjbectRootEx
可以用来处理内部对象构造失败并保护外部对象在内部接口被释放或删除的时候不被删除。
template< class ThreadModel >
class CComObjectRootEx : public CComObjectRootBase
参数:
ThreadModel:
一个实现了期望线程模式的类。你能够明确地通过设置ThreadModel为CComSingleThreadModel,CComMultiThreadModel,CComMultiThreadModelNoCS来选择线程模型。你能够接受服务器设置的现成模型CComObjectThreadModel或CComGlobalsThreadModel为默认线程模型。
备注:
一个实现COM服务器的类必须实现CComObjectRootEx或CComObjectRoot. 如果你的类声明指定DECLARE_POLY_AGGREATABLE宏,ATL在IClassFactory::CreateInstance被调用的时候创建一个CComPolyObject<CYourClass>的实例。在创建过程中,外部unknown的值被检查。如果它是NULL,IUnkknown被实现为一个非聚合的对象,如果外部unkonwn是非NULL,IUnknown实现为一个聚合对象。
如果你的类并没有指定DECLARE_POLY_AGGREATABLE宏,ATL为聚合对象创建一个ComObject<CYourClass>的实例,为非聚合类创建一个CComAggObject<CYourClass>对象的实例。CComPolyObject的好处就是可以让你避免在你的模块中为处理聚合和非聚合情况而使用CComAggObject和CComObject.一个CComPolyObject对象就可以处理这两种情况,因此你的代码中仅仅存在一份虚表和一份函数。如果虚表很大,这能够明显的减少你模块的大小。然而,如果你的虚表很小,使用CComPolyObject能够导致稍微较大的模块,因为这种情况下并没有针对聚合和非聚合对象想CComAggObject和CComObject那样的优化处理。
当你使用ATL对象助手创建一个完全控件或IE控件的时候,DECLARE_POLY_AGGREGATABLE宏将自动的添加到你的类定义中。
如果你的对象是聚合的,IUNKNOWN被CComAggObject和CComPolyObject实现,这些类代理ueryInterface,
AddRef和Release来调用CComObjectRootEx的OuterQueryInterface,OuterAddRef和OuterRelease方法来转发给外部的unknown。典型的在你的类中重载CComObjectRootEx::FinalConstruct 来创建任何聚合对象重载CComObjectRootEx::FinalRelease来释放任何聚合对象。
如果你的对象不是一个聚合对象,IUnknown通过CComObject或CComPolyObject实现,这种情况下,调用
QueryInterface,AddRef,Release被调用CComObjectRootEx的InternalQueryInterface,InternalAddRef,和InternalRelease 来执行实际的操作。
要求:
Windows CE versions: 2.0 and later
Header file: Declared in Atlcom.h