ATL COM オブジェクトの基本事項

次の図は、ATL COM オブジェクトの定義に使用するクラスとインターフェイスとの関係を示しています。

ATL 構造

[!メモ]

この図は、CComObjectCYourClass から派生し、CComAggObject および CComPolyObjectCYourClass がメンバー変数として含まれていることを示しています。

ATL COM オブジェクトを定義するには、3 とおりの方法があります。標準的な方法は、CYourClass から派生する CComObject クラスを使用する方法です。2 つ目は、CComAggObject クラスを使用して集約オブジェクトを作成する方法です。3 つ目は、CComPolyObject クラスを使用する方法です。CComPolyObject はハイブリッドとして動作します。つまり、最初に作成された方法に応じて、CComObject クラスまたは CComAggObject クラスとして機能します。CComPolyObject クラスの使用方法の詳細については、「CComPolyObject クラス」を参照してください。

標準 ATL COM を使用する場合は、外部オブジェクトと内部オブジェクトの 2 つのオブジェクトを使用します。外部クライアントは、外部オブジェクトで定義されたラッパー関数を通じて内部オブジェクトの機能にアクセスします。外部オブジェクトの型は CComObject です。

集約オブジェクトを使用する場合、外部オブジェクトは、内部オブジェクトの機能に対するラッパーを提供しません。代わりに、外部オブジェクトは、外部クライアントによって直接アクセスされるポインターを提供します。このシナリオでは、外部オブジェクトの型は CComAggObject です。内部オブジェクトは、外部オブジェクトのメンバー変数であり、その型は CYourClass です。

クライアントは内部オブジェクトと対話する際に外部オブジェクトを経由する必要がないため、通常は集約オブジェクトの方が効率的です。また、集約オブジェクトのインターフェイスがクライアントから直接使用可能であれば、外部オブジェクトは集約オブジェクトの機能を認識する必要がありません。ただし、すべてのオブジェクトを集約できるとは限りません。オブジェクトを集約するには、そのオブジェクトが集約を考慮してデザインされている必要があります。

ATL は、次の 2 段階で IUnknown を実装します。

ATL COM オブジェクトのその他の部分は、ほかのクラスで処理します。

  • CComCoClass は、オブジェクトの既定のクラス ファクトリと集約モデルを定義します。

  • IDispatchImpl は、オブジェクトのデュアル インターフェイスの IDispatch Interface 部分について、既定の実装を用意します。

  • ISupportErrorInfoImpl は、エラー情報が正しく呼び出しチェイン上に反映されるか確認する ISupportErrorInfo インターフェイスを実装します。

このセクションの内容

関連項目

  • ATL プロジェクトの作成
    ATL COM オブジェクトの作成に関する情報を提供します。

  • ATL
    Active Template Library を使用したプログラミングの概念を説明するトピックへのリンクを示します。

参照

その他の技術情報

ATL の概念