实现CComObject、CComAggObject和CComPolyObject

模板类 CComObjectCComAggObject,并且,CComPolyObject 始终是继承链的派生类。是它们的职责到方法的句柄都在 IUnknown的: QueryInterfaceAddRefRelease。此外,CComAggObjectCComPolyObject (当用于合成对象)提供特定引用对于内部未知和 QueryInterface 语义所需的计数。

是否使用 CComObjectCComAggObjectCComPolyObject 取决于是否声明之一(或)下面的宏:

效果

DECLARE_NOT_AGGREGATABLE

始终使用 CComObject

DECLARE_AGGREGATABLE

使用 CComAggObject,如果对象是聚合和 CComObject,如果未启用。CComCoClass 因此包含此宏,如果 DECLARE_*_AGGREGATABLE 宏都在您的选件类没有声明为,这将是默认设置。

DECLARE_ONLY_AGGREGATABLE

始终使用 CComAggObject。如果对象不进行聚合,返回false。

DECLARE_POLY_AGGREGATABLE

IClassFactory::CreateInstance 调用时,ATL创建 CComPolyObject<CYourClass> 实例。在创建时,外部未知的值进行检查。如果是 NULLIUnknown 为一nonaggregated对象实现。如果外部未知不是 NULLIUnknown 为一个复合的对象实现。

使用 CComAggObjectCComObject 的优点是 IUnknown 的实现所创建的命名对象转换。例如,在中,而合成对象需要内部未知的引用计数以及指向外部未知,一nonaggregated对象只需要引用计数。

使用 CComPolyObject 的优点是您避免为 CComAggObjectCComObject 在的模块处理合成和nonaggregated大小写。一个 CComPolyObject 对象处理两种情况。这意味着只有一个副本的vtable和函数的一个副本存在于您的模块。如果vtable大,则可以显着降低您的模块范围。但是,因此,如果vtable很小,使用 CComPolyObject 从而导致一个稍微大的模块范围,因为它没有为一个复合的或nonaggregated对象转换,如 CComAggObjectCComObject

请参见

参考

ATL COM对象的基本知识

其他资源

摘要任务和选件类工厂宏