CComObjectRootEx クラス

更新 : 2007 年 11 月

このクラスには、非集約オブジェクトと集約オブジェクトの両方について、オブジェクトの参照カウントを管理するメソッドが用意されています。

template<
   class ThreadModel 
>
class CComObjectRootEx : public CComObjectRootBase

パラメータ

解説

CComObjectRootEx は、非集約オブジェクトと集約オブジェクトの両方のオブジェクトの参照カウントを管理します。非集約オブジェクトの場合は、そのオブジェクトの参照カウントを保持します。集約オブジェクトの場合は、外側の IUnknown へのポインタを保持します。集約オブジェクトの場合は、CComObjectRootEx のメソッドを使用して、内部オブジェクトの構築エラーを処理できます。また、内部インターフェイスが解放されたり、内部オブジェクトが削除されても外部オブジェクトが削除されないように保護することもできます。

COM サーバーを実装するクラスは、CComObjectRootEx または CComObjectRoot から継承する必要があります。

クラス定義で DECLARE_POLY_AGGREGATABLE マクロが指定されている場合、IClassFactory::CreateInstance が呼び出されると、ATL は CComPolyObject<CYourClass> のインスタンスを作成します。インスタンスの作成時には、外側の IUnknown の値がチェックされます。値が NULL の場合、IUnknown は非集約オブジェクト用に実装されます。外側の IUnknownNULL でない場合、IUnknown は集約オブジェクト用に実装されます。

クラス定義で DECLARE_POLY_AGGREGATABLE マクロが指定されていない場合は、ATL は、集約オブジェクトに対しては CAggComObject<CYourClass> のインスタンスを作成し、非集約オブジェクトに対しては CComObject<CYourClass> のインスタンスを作成します。

CComPolyObject を使用する利点は、集約クラスと非集約クラスを処理するときに、モジュールに CComAggObjectCComObject の両方を持つ必要がないことです。CComPolyObject オブジェクトが 1 つあれば両方を扱うことができます。したがって、モジュール中には vtable のコピー 1 つと、関数群のコピー 1 つだけが存在することになります。vtable のサイズが大きい場合は、これによってモジュール サイズを大幅に縮小できます。ただし、vtable のサイズが小さい場合は、CComPolyObject を使うとモジュール サイズが逆に大きくなってしまう可能性があります。これは、CComAggObjectCComObject とは異なり、CComPolyObject は集約オブジェクトや非集約オブジェクト用に最適化されていないためです。

アグリゲートされるオブジェクトの場合、IUnknownCComAggObject または CComPolyObject によって実装されます。これらのクラスは、QueryInterfaceAddRefRelease の呼び出しをそれぞれ CComObjectRootExOuterQueryInterfaceOuterAddRefOuterRelease に渡し、外部オブジェクトの IUnknown に転送します。通常、アグリゲートされるオブジェクトを作成するには、クラスで CComObjectRootEx::FinalConstruct をオーバーライドします。また、アグリゲートされるオブジェクトを解放するには、CComObjectRootEx::FinalRelease をオーバーライドします。

非集約オブジェクトの場合、IUnknownCComObject または CComPolyObject によって実装されます。この場合は、QueryInterfaceAddRefRelease の呼び出しは、それぞれ CComObjectRootExInternalQueryInterfaceInternalAddRefInternalRelease に渡され、実際の処理が行われます。

必要条件

ヘッダー : atlcom.h

参照

参照

CComAggObject クラス

CComObject クラス

CComPolyObject クラス

その他の技術情報

CComObjectRootEx のメンバ

ATL クラスの概要