次の方法で共有


CComPolyObject クラス

このクラスは、集計または非集計オブジェクトの IUnknown を実装します。

構文

template<class contained>
class CComPolyObject : public IUnknown,
      public CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>

パラメーター

contained
CComObjectRoot または CComObjectRootEx から、およびオブジェクトでサポートするその他のインターフェイスから派生するクラス。

メンバー

パブリック コンストラクター

名前 説明
CComPolyObject::CComPolyObject コンストラクター。
CComPolyObject::~CComPolyObject デストラクター。

パブリック メソッド

名前 説明
CComPolyObject::AddRef オブジェクトの参照カウントをインクリメントします。
CComPolyObject::CreateInstance (静的)CoCreateInstance のオーバーヘッドを発生させずに、新しい CComPolyObject< contained > オブジェクトを作成できます。
CComPolyObject::FinalConstruct m_contained の最終的な初期化を実行します。
CComPolyObject::FinalRelease m_contained の最終的な破棄を実行します。
CComPolyObject::QueryInterface 要求されたインターフェイスへのポインターを取得します。
CComPolyObject::Release オブジェクトの参照カウントをデクリメントします。

パブリック データ メンバー

名前 説明
CComPolyObject::m_contained オブジェクトが集計されている場合は外部不明に対して、オブジェクトが集計されていない場合はオブジェクトの IUnknown に対して、IUnknown の呼び出しを委任します。

解説

CComPolyObject は、集計または非集計オブジェクトの IUnknown を実装します。

CComPolyObject のインスタンスが作成されると、外部不明の値がチェックされます。 NULL の場合は、IUnknown が非集計オブジェクトに対して実装されます。 外部不明が NULL ではない場合は、IUnknown が集計オブジェクトに対して実装されます。

CComPolyObject を使用する利点は、集計されるケースと集計されないケースを処理するために CComAggObjectCComObject の両方をモジュールに含める必要がないことです。 1 つの CComPolyObject オブジェクトで両方のケースが処理されます。 つまり、モジュールには、vtable の 1 つのコピーと関数の 1 つのコピーのみが存在します。 vtable が大きい場合、これにより、モジュールのサイズが大幅に縮小される可能性があります。 一方、vtable が小さい場合は、CComPolyObject を使用すると、CComAggObjectCComObject のように、集計オブジェクトまたは非集計オブジェクトに合わせて最適化されないため、モジュールのサイズが若干大きくなります。

オブジェクトのクラス定義で DECLARE_POLY_AGGREGATABLE マクロが指定されている場合、CComPolyObject はオブジェクトの作成に使用されます。 ATL プロジェクト ウィザードを使用してフル コントロールまたは Internet Explorer コントロールを作成すると、DECLARE_POLY_AGGREGATABLE が自動的に宣言されます。

集計されている場合、CComPolyObject オブジェクトでは、外部オブジェクトの IUnknown とは別の独自の IUnknown を備え、独自の参照カウントを保持します。 CComPolyObjectCComContainedObject を使用して、外部不明に委任します。

集計の詳細については、記事「ATL COM オブジェクトの基礎」を参照してください。

継承階層

CComObjectRootBase

CComObjectRootEx

IUnknown

CComPolyObject

要件

ヘッダー: atlcom.h

CComPolyObject::AddRef

オブジェクトの参照カウントをインクリメントします。

STDMETHOD_(ULONG, AddRef)();

戻り値

診断またはテストに役立つ可能性がある値。

CComPolyObject::CComPolyObject

コンストラクター。

CComPolyObject(void* pv);

パラメーター

pv
[in] オブジェクトが集計されている場合は外部不明へのポインター、オブジェクトが集計されていない場合は NULL。

解説

CComContainedObject データ メンバー (m_contained) を初期化し、モジュールのロック数をインクリメントします。

モジュールのロック数のデクリメントはデストラクターによって行われます。

CComPolyObject::~CComPolyObject

デストラクター。

~CComPolyObject();

解説

割り当てられているすべてのリソースを解放し、FinalRelease を呼び出して、モジュールのロック数をデクリメントします。

CComPolyObject::CreateInstance

CoCreateInstance のオーバーヘッドを発生させずに、新しい CComPolyObject<contained > オブジェクトを作成できます。

static HRESULT WINAPI CreateInstance(
    LPUNKNOWN pUnkOuter,
    CComPolyObject<contained>** pp);

パラメーター

pp
[out] CComPolyObject< contained> ポインターへのポインター。 CreateInstance が正常に終了しない場合、pp は NULL に設定されます。

戻り値

標準の HRESULT 値。

解説

返されるオブジェクトの参照カウントは 0 なので、すぐに AddRef を呼び出して、完了したら、Release を使用してオブジェクト ポインターに対する参照を解放します。

オブジェクトに直接アクセスする必要はないが、CoCreateInstance のオーバーヘッドなしで新しいオブジェクトを作成したい場合は、代わりに CComCoClass::CreateInstance を使用します。

CComPolyObject::FinalConstruct

このメソッドは、オブジェクトの構築の最後の段階で呼び出され、m_contained データ メンバーに対して最終的な初期化を実行します。

HRESULT FinalConstruct();

戻り値

標準の HRESULT 値。

CComPolyObject::FinalRelease

このメソッドは、オブジェクトの破棄中に呼び出され、m_contained データ メンバーを解放します。

void FinalRelease();

CComPolyObject::m_contained

クラスから派生した CComContainedObject オブジェクト。

CComContainedObject<contained> m_contained;

パラメーター

contained
[in] CComObjectRoot または CComObjectRootEx から、およびオブジェクトでサポートするその他のインターフェイスから派生するクラス。

解説

オブジェクトが集計されている場合は外部不明に対して、オブジェクトが集計されていない場合はオブジェクトの IUnknown に対して、m_contained を介した IUnknown の呼び出しが委任されます。

CComPolyObject::QueryInterface

要求されたインターフェイスへのポインターを取得します。

STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
template <class Q>
HRESULT QueryInterface(Q** pp);

パラメーター

Q
COM インターフェイス。

iid
[入力] 要求されるインターフェイスの識別子。

ppvObject
[出力] iid によって識別されるインターフェイス ポインターへのポインター。 オブジェクトでこのインターフェイスがサポートされていない場合、ppvObject は NULL に設定されます。

pp
[out] __uuidof(Q) によって識別されるインターフェイスへのポインター。

戻り値

標準の HRESULT 値。

解説

集計オブジェクトの場合、要求されたインターフェイスが IUnknown である場合は、QueryInterface によって、集計オブジェクトの独自の IUnknown を指すポインターが返され、参照カウントがインクリメントされます。 それ以外の場合、このメソッドでは、CComContainedObject データ メンバー (m_contained) を介してインターフェイスを照会します。

CComPolyObject::Release

オブジェクトの参照カウントをデクリメントします。

STDMETHOD_(ULONG, Release)();

戻り値

デバッグ ビルドでは、診断またはテストに役立つ可能性のある値が、Release から返されます。 デバッグ以外のビルドでは、Release から常に 0 が返されます。

関連項目

CComObjectRootEx クラス
DECLARE_POLY_AGGREGATABLE
クラスの概要