現在オフラインです。再接続するためにインターネットの接続を待っています

[VC60] ATL で COM オブジェクトをアグリゲートする方法

この記事は、以前は次の ID で公開されていました: JP173823
サポート期間が終了した「サポート技術情報」資料に関する免責事項
この資料は、マイクロソフトでサポートされていない製品について記述したものです。そのため、この資料は現状ベースで提供されており、今後更新されることはありません。
概要
この資料では、ATL プロジェクトの COM オブジェクトをアグリゲートする方法について紹介します。

アグリゲートの手順は以下のとおりです。
  1. クラス オブジェクトに IUnknown ポインタを追加し、コンストラクタで NULL に初期化します。
  2. DECLARE_PROTECT_FINAL_CONSTRUCT マクロを追加して、(FinalConstruct の中に) 内部アグリゲート オブジェクトが参照カウントをインクリメントした後で、デクリメントして 0 になった場合に、オブジェクトが削除されないように保護します。
  3. COM_INTERFACE_ENTRY_AGGREGATE マクロに第 2 パラメータとして定義した IUnknown ポインタを使用します。第 1 パラメータは、エクスポーズしたいインナー オブジェクトのインターフェイス IID です。
  4. FinalConstruct() をオーバーライドして、アグリゲートを作成します。
  5. FinalRelease() をオーバーライドして、IUnknown ポインタを開放します。
詳細
FinalConstruct の処理中に、インターフェイスをグループから開放する場合は、クラス オブジェクトの定義に、DECLARE_PROTECT_FINAL_CONSTRUCT マクロを追加する必要があります。

以下のサンプル コードでは、クラス定義で行う 4 手順すべてを示しています。このオブジェクトは、COutObj というシンプルなオブジェクトで、別なオブジェクト CInnObj をアグリゲートします。

サンプル コード

      class ATL_NO_VTABLE COutObj :            public CComObjectRootEx<CComSingleThreadModel>,            public CComCoClass<COutObj, &CLSID_OutObj>,            public IDispatchImpl<IOutObj, &IID_IOutObj, &LIBID_OUTEROBJLib>      {      public:         COutObj() : m_pInnerUnk(NULL) // 手順 1         {         }         DECLARE_GET_CONTROLLING_UNKNOWN()         DECLARE_REGISTRY_RESOURCEID(IDR_OUTOBJ)         DECLARE_PROTECT_FINAL_CONSTRUCT() // 手順 2         BEGIN_COM_MAP(COutObj)            COM_INTERFACE_ENTRY(IOutObj)            COM_INTERFACE_ENTRY(IDispatch)            COM_INTERFACE_ENTRY_AGGREGATE(IID_IInnObj, m_pInnerUnk) // 手順 3         END_COM_MAP()         // 手順 4 の開始         HRESULT FinalConstruct()         {            HRESULT hr;            CLSID   clsidInner;            hr = CLSIDFromProgID(L"InnObj.InnObj.1", &clsidInner);            if (hr == S_OK)               hr = CoCreateInstance(clsidInner, GetControllingUnknown(),                                     CLSCTX_INPROC_SERVER, IID_IUnknown,                                     (void**)&m_pInnerUnk);            return hr;         } // 手順 4 の終了         void FinalRelease(){m_pInnerUnk->Release();} // 手順 5         // IOutObj      public:         STDMETHOD(Test)();      private:         LPUNKNOWN m_pInnerUnk; // 手順 1      };
インナー オブジェクトが同一の ATL サーバーにある場合、CoCreateInstance を使わずに次のコードを使って、インナー オブジェクトを作成してください。
      HRESULT FinalConstruct()         {            return  CInnObj::_CreatorClass::CreateInstance(                GetControllingUnknown(), IID_IUnknown,                (void**)&m_pInnerUnk);         }
関連情報
- Visual C++ ユーザーズガイド - リファレンス  - Microsoft Foundation Classes リファレンス  - C/C++ Language and C++ Library   - ATL (Active Template Library)    - 解説     - COM および ATL 入門      - COM 入門       - アグリゲーション- Visual C++ ユーザーズガイド - リファレンス  - Microsoft Foundation Classes リファレンス  - C/C++ Language and C++ Library   - ATL (Active Template Library)    - 解説     - ATL COM オブジェクトの基本      - アグリゲートを作成する  (C) Microsoft Corporation 1997, All Rights Reserved.      Contributions by Chuck Bell, Microsoft Corporation.
関連情報
この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 173823 (最終更新日 2000-06-01) をもとに作成したものです。

derive override kbATL210 kbATL300 kbctrl kbserver
プロパティ

文書番号:173823 - 最終更新日: 06/17/2003 09:22:22 - リビジョン: 2.2

  • Microsoft ActiveX Template Library 2.1
  • Microsoft ActiveX Template Library 3.0
  • aggregate kbinfo KB173823
フィードバック