ATL COM オブジェクトの基礎
次の図は、ATL COM オブジェクトの定義に使用されるクラスとインターフェイス間の関係を示しています。
Note
この図は、CComObject
が CYourClass
から派生しているのに対して、CComAggObject
と CComPolyObject
にはメンバー変数として CYourClass
が含まれていることを示しています。
ATL COM オブジェクトを定義する方法は、3 つあります。 標準的なオプションは、CYourClass
から派生している CComObject
クラスを使用します。 2 番目のオプションは、CComAggObject
クラスを使用して集約されたオブジェクトを作成します。 3 番目のオプションは、CComPolyObject
を使用します。 CComPolyObject
は、ハイブリッドとして動作します。最初に作成された方法によって、CComObject
クラスまたは CComAggObject
クラスとして機能できます。 CComPolyObject
クラスの使用方法の詳細については、「CComPolyObject クラス」を参照してください。
標準 ATL COM を使用する場合は、外側のオブジェクトと内部オブジェクトの 2 つのオブジェクトを使用します。 外部クライアントは、外部オブジェクトで定義されているラッパー関数を介して、内部オブジェクトの機能にアクセスします。 外部オブジェクトのタイプは、CComObject
です。
集約されたオブジェクトを使用する場合、外側のオブジェクトは内部オブジェクトの機能のラッパーを提供しません。 代わりに、外部オブジェクトは、外部クライアントから直接アクセスされるポインターを提供します。 このシナリオでは、外部オブジェクトのタイプは CComAggObject
です。 内部オブジェクトは、外部オブジェクトのメンバー変数で、タイプは CYourClass
です。
クライアントは内部オブジェクトとやりとりするために外部オブジェクトを通過する必要はないので、通常、集約されたオブジェクトの方が効率的です。 また、集約されたオブジェクトのインターフェイスをクライアントで直接使用できる場合、集約されたオブジェクトの機能を外部オブジェクトで認識する必要はありません。 ただし、すべてのオブジェクトが集約できるわけではありません。 オブジェクトを集約するには、集約を念頭に置いて設計する必要があります。
ATL により IUnknown は 2 つのフェーズで実装されます。
CComObject、CComAggObject、CComPolyObject で
IUnknown
メソッドが実装されます。CComObjectRoot または CComObjectRootEx で
IUnknown
の参照カウントと外部ポインターが管理されます。
ATL COM オブジェクトのその他の側面は、他のクラスによって処理されます。
CComCoClass によりオブジェクトの既定のクラス ファクトリと集約モデルが定義されます。
IDispatchImpl により、オブジェクト上のすべてのデュアル インターフェイスの
IDispatch Interface
部分の既定の実装が提供されます。ISupportErrorInfoImpl により、エラー情報を呼び出しチェーンの上位に確実に正しく伝達する
ISupportErrorInfo
インターフェイスが実装されます。
このセクションの内容
CComObjectRootEx の実装
CComObjectRootEx
を実装する COM マップ エントリの例を示します。
CComObject、CComAggObject、CComPolyObject の実装
DECLARE_*_AGGREGATABLE マクロが CComObject
、CComAggObject
、CComPolyObject
の使用に影響する仕組みについて説明します。
IDispatch と IErrorInfo のサポート
IDispatch
と IErrorInfo
インターフェイスをサポートするために使用する ATL 実装クラスを一覧表示します。
IDispEventImpl のサポート
クラスのコネクション ポイントを実装する手順について説明します。
既定のクラス ファクトリと集計モデルの変更
既定のクラス ファクトリと集約モデルを変更するために使用するマクロを表示します。
集計オブジェクトの作成
集約されたオブジェクトを作成する手順の一覧を示します。
関連セクション
ATL プロジェクトの作成
ATL COM オブジェクトの作成に関する情報を提供します。
ATL
Active Template Library を使用してプログラミングする方法に関する概念説明のトピックへのリンクを提供します。