CComObjectRootEx クラス
更新 : 2007 年 11 月
このクラスには、非集約オブジェクトと集約オブジェクトの両方について、オブジェクトの参照カウントを管理するメソッドが用意されています。
template<
class ThreadModel
>
class CComObjectRootEx : public CComObjectRootBase
パラメータ
- ThreadModel
スレッド化モデルを実装するメソッドを持つクラス。スレッド モデルを明示的に指定するには、ThreadModel を CComSingleThreadModel、CComMultiThreadModel、または CComMultiThreadModelNoCS に設定します。サーバーの既定のスレッド モデルを使用するには、ThreadModel を CComObjectThreadModel または CComGlobalsThreadModel に設定します。
解説
CComObjectRootEx は、非集約オブジェクトと集約オブジェクトの両方のオブジェクトの参照カウントを管理します。非集約オブジェクトの場合は、そのオブジェクトの参照カウントを保持します。集約オブジェクトの場合は、外側の IUnknown へのポインタを保持します。集約オブジェクトの場合は、CComObjectRootEx のメソッドを使用して、内部オブジェクトの構築エラーを処理できます。また、内部インターフェイスが解放されたり、内部オブジェクトが削除されても外部オブジェクトが削除されないように保護することもできます。
COM サーバーを実装するクラスは、CComObjectRootEx または CComObjectRoot から継承する必要があります。
クラス定義で DECLARE_POLY_AGGREGATABLE マクロが指定されている場合、IClassFactory::CreateInstance が呼び出されると、ATL は CComPolyObject<CYourClass> のインスタンスを作成します。インスタンスの作成時には、外側の IUnknown の値がチェックされます。値が NULL の場合、IUnknown は非集約オブジェクト用に実装されます。外側の IUnknown が NULL でない場合、IUnknown は集約オブジェクト用に実装されます。
クラス定義で DECLARE_POLY_AGGREGATABLE マクロが指定されていない場合は、ATL は、集約オブジェクトに対しては CAggComObject<CYourClass> のインスタンスを作成し、非集約オブジェクトに対しては CComObject<CYourClass> のインスタンスを作成します。
CComPolyObject を使用する利点は、集約クラスと非集約クラスを処理するときに、モジュールに CComAggObject と CComObject の両方を持つ必要がないことです。CComPolyObject オブジェクトが 1 つあれば両方を扱うことができます。したがって、モジュール中には vtable のコピー 1 つと、関数群のコピー 1 つだけが存在することになります。vtable のサイズが大きい場合は、これによってモジュール サイズを大幅に縮小できます。ただし、vtable のサイズが小さい場合は、CComPolyObject を使うとモジュール サイズが逆に大きくなってしまう可能性があります。これは、CComAggObject や CComObject とは異なり、CComPolyObject は集約オブジェクトや非集約オブジェクト用に最適化されていないためです。
アグリゲートされるオブジェクトの場合、IUnknown は CComAggObject または CComPolyObject によって実装されます。これらのクラスは、QueryInterface、AddRef、Release の呼び出しをそれぞれ CComObjectRootEx の OuterQueryInterface、OuterAddRef、OuterRelease に渡し、外部オブジェクトの IUnknown に転送します。通常、アグリゲートされるオブジェクトを作成するには、クラスで CComObjectRootEx::FinalConstruct をオーバーライドします。また、アグリゲートされるオブジェクトを解放するには、CComObjectRootEx::FinalRelease をオーバーライドします。
非集約オブジェクトの場合、IUnknown は CComObject または CComPolyObject によって実装されます。この場合は、QueryInterface、AddRef、Release の呼び出しは、それぞれ CComObjectRootEx の InternalQueryInterface、InternalAddRef、InternalRelease に渡され、実際の処理が行われます。
必要条件
ヘッダー : atlcom.h