CComPolyObject クラス
更新 : 2007 年 11 月
このクラスは、集約オブジェクトまたは非集約オブジェクトの IUnknown を実装します。
template<
class contained
>
class CComPolyObject : public IUnknown, public CComObjectRootEx
< contained::_ThreadModel::ThreadModelNoCS >
パラメータ
- contained
作成したクラス。CComObjectRoot または CComObjectRootEx から派生させるか、作成したクラスでサポートする任意のインターフェイスから派生させます。
解説
CComPolyObject は集約オブジェクトと非集約オブジェクトの IUnknown を実装します。
CComPolyObject のインスタンスが作成される場合は、外側の IUnknown の値がチェックされます。値が NULL の場合、IUnknown は非集約オブジェクト用に実装されます。外側の IUnknown が NULL でない場合、IUnknown は集約オブジェクト用に実装されます。
CComPolyObject を使うことの利点は、集約オブジェクトと非集約オブジェクトを扱う場合に、モジュール中に CComAggObject と CComObject の両方を持つ必要がないことです。CComPolyObject オブジェクトが 1 つあれば両方を扱うことができます。つまり、モジュール中には vtable のコピーと関数のコピーがそれぞれ 1 つだけ存在することになります。vtable のサイズが大きい場合は、これによってモジュール サイズを大幅に縮小できます。ただし、vtable のサイズが小さい場合は、CComPolyObject を使うとモジュール サイズが逆に大きくなってしまう可能性があります。これは、CComAggObject や CComObject とは異なり、CComPolyObject は集約オブジェクトや非集約オブジェクト用に最適化されていないためです。
オブジェクトのクラス定義に DECLARE_POLY_AGGREGATABLE マクロを指定すると、オブジェクトの作成に CComPolyObject が使用されます。ATL プロジェクト ウィザードを使用してフル コントロールまたは Internet Explorer コントロールを作成すると、DECLARE_POLY_AGGREGATABLE が自動的に宣言されます。
集約される場合は、CComPolyObject オブジェクトは、外側の IUnknown とは別に独自の IUnknown を持ち、独自の参照カウントを管理します。CComPolyObject は CComContainedObject を使って、外側の IUnknown に処理を代行させます。
集約の詳細については、「ATL COM オブジェクトの基本事項」を参照してください。
必要条件
ヘッダー : atlcom.h