次の方法で共有


CComObject、CComAggObject、および CComPolyObject の実装

テンプレートは CComObjectCComAggObjectを並べ替え、CComPolyObject は継承チェーンの最派生クラスは常にです。これは IUnknownのすべてのメソッドを処理する必要があります: QueryInterfaceAddRef[リリース]。また (集約オブジェクトに対して使用された場合)、CComAggObjectCComPolyObject は内側の演算子に必要な QueryInterface の特別な参照カウント、およびセマンティクスを提供します。

CComObjectCComAggObject、または CComPolyObject が使用されるかは次のマクロの 1 文字 (またはなし) 宣言するかによります:

マクロ

効果

DECLARE_NOT_AGGREGATABLE

CComObjectを常に使用します。

DECLARE_AGGREGATABLE

あるオブジェクトが CComObject 集計する場合 CComAggObject を使用します。CComCoClassDECLARE_*_AGGREGATABLE のマクロはいずれも、クラスで宣言されていない場合は、このマクロを、これが既定の設定が含まれています。

DECLARE_ONLY_AGGREGATABLE

CComAggObjectを常に使用します。オブジェクトが集約するエラーを返します。

DECLARE_POLY_AGGREGATABLE

ATL は IClassFactory::CreateInstance が呼び出されたときに CComPolyObjectCYourClass のインスタンスを作成します。作成時に、外側の不明の値がチェックされます。これは null場合、IUnknown は集約オブジェクトに実装されます。外側の nullが不明である、IUnknown は集約オブジェクトに実装されます。

CComAggObjectCComObject を使用する利点は IUnknown の実装が作成されたオブジェクトの種類用に最適化されます。たとえば、非集約オブジェクトは集約オブジェクトは外側の不明に内部の未知の参照カウントとポインターの両方を必要なだけが、参照カウントが必要です。

CComPolyObject を使用する利点は集約されます。集約ケースを処理するモジュールで CComAggObjectCComObject の両方があることを避けるためです。CComPolyObject の単一のオブジェクトは両方を処理します。これは、vtable の 1 種類のコピーと関数の 1 のコピーは、モジュールであることを意味します。、vtable の場合、これは大幅に、モジュールのサイズを抑えることができます。ただし、ようになります CComAggObjectCComObjectがやや多くのモジュールのサイズで vtable が小さく、集約または非集約オブジェクト用に最適化されていないため CComPolyObject を使用して行われます。

参照

関連項目

ATL COM オブジェクトの基本事項

その他の技術情報

集約とクラス ファクトリに関するマクロ