实现CComObject、CComAggObject和CComPolyObject
模板类 CComObject,CComAggObject,并且,CComPolyObject 始终是继承链的派生类。是它们的职责到方法的句柄都在 IUnknown的: QueryInterface、 AddRef和 Release。此外,CComAggObject 和 CComPolyObject (当用于合成对象)提供特定引用对于内部未知和 QueryInterface 语义所需的计数。
是否使用 CComObject、 CComAggObject或 CComPolyObject 取决于是否声明之一(或)下面的宏:
宏 |
效果 |
---|---|
DECLARE_NOT_AGGREGATABLE |
始终使用 CComObject。 |
DECLARE_AGGREGATABLE |
使用 CComAggObject,如果对象是聚合和 CComObject,如果未启用。CComCoClass 因此包含此宏,如果 DECLARE_*_AGGREGATABLE 宏都在您的选件类没有声明为,这将是默认设置。 |
DECLARE_ONLY_AGGREGATABLE |
始终使用 CComAggObject。如果对象不进行聚合,返回false。 |
DECLARE_POLY_AGGREGATABLE |
当 IClassFactory::CreateInstance 调用时,ATL创建 CComPolyObject<CYourClass> 实例。在创建时,外部未知的值进行检查。如果是 NULL,IUnknown 为一nonaggregated对象实现。如果外部未知不是 NULL,IUnknown 为一个复合的对象实现。 |
使用 CComAggObject 和 CComObject 的优点是 IUnknown 的实现所创建的命名对象转换。例如,在中,而合成对象需要内部未知的引用计数以及指向外部未知,一nonaggregated对象只需要引用计数。
使用 CComPolyObject 的优点是您避免为 CComAggObject 和 CComObject 在的模块处理合成和nonaggregated大小写。一个 CComPolyObject 对象处理两种情况。这意味着只有一个副本的vtable和函数的一个副本存在于您的模块。如果vtable大,则可以显着降低您的模块范围。但是,因此,如果vtable很小,使用 CComPolyObject 从而导致一个稍微大的模块范围,因为它没有为一个复合的或nonaggregated对象转换,如 CComAggObject 和 CComObject。