如何彙總的 ATL COM 物件

文章翻譯 文章翻譯
文章編號: 173823 - 檢視此文章適用的產品。
附註Microsoft Visual C++.NET (2002),支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。
全部展開 | 全部摺疊

在此頁中

結論

下列步驟將告訴您,如何彙總為 COM 物件在 ATL 專案中的:
  1. 類別物件新增 IUnknown 指標,並在建構函式中初始化為 NULL。
  2. 加入 0 DECLARE_PROTECT_FINAL_CONSTRUCT 巨集來保護您的物件遭到刪除如果期間 FinalConstruct) 內部的彙總的物件會遞增參考次數然後減量計數。

    注意: 如果您使用的 Visual C++.NET 精靈這為您新增。
  3. 使用您定義為第二個參數,來 COM_INTERFACE_ENTRY_AGGREGATE 巨集的 IUnknown 指標。第一個參數是介面的您想要公開 (Expose) 的內部物件的 IID。
  4. 若要建立彙總 FinalConstruct() 會覆寫。
  5. 覆寫 FinalRelease() 放開 [IUnknown 指標。

其他相關資訊

如果您使用,並釋放介面從彙總期間 FinalConstruct 您應該將 DECLARE_PROTECT_FINAL_CONSTRUCT 巨集新增至您的類別物件的定義。

以下是與所有四個類別定義中完成步驟的範例。這是簡單的物件 [彙總另一個簡單的物件,CInnObj 的 COutObj。

範例程式碼

   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) // Step 1
      {
      }
      DECLARE_GET_CONTROLLING_UNKNOWN()
      DECLARE_REGISTRY_RESOURCEID(IDR_OUTOBJ)
      DECLARE_PROTECT_FINAL_CONSTRUCT() // Step 2

      BEGIN_COM_MAP(COutObj)
         COM_INTERFACE_ENTRY(IOutObj)
         COM_INTERFACE_ENTRY(IDispatch)
         COM_INTERFACE_ENTRY_AGGREGATE(IID_IInnObj, m_pInnerUnk) // Step 3
      END_COM_MAP()

      // Start of step 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;
      } // End of step 4

      void FinalRelease(){m_pInnerUnk->Release();} // Step 5

      // IOutObj
   public:
      STDMETHOD(Test)();
   private:
      LPUNKNOWN m_pInnerUnk; // Step 1
   };
				
如果內部物件是在相同的 ATL 伺服器中,那麼您可以使用下列程式碼來建立內部物件沒有 CoCreateInstance:
   HRESULT FinalConstruct()
      {
         return  CInnObj::_CreatorClass::CreateInstance(
             GetControllingUnknown(), IID_IUnknown,
             (void**)&m_pInnerUnk);

      }
				

?考

Visual C++ 叢書線上: Visual C++ 叢書 ; C/C + + 語言和 C + + 程式庫 ; 使用中的樣板程式庫; 發行項; 簡介 COM 和 ATL ; COM 簡介; 彙總

Visual C++ 活頁線上: Visual C++ 叢書 ; C/C + + 語言和 C + + 程式庫 ; 使用中的樣板程式庫 ; 文件 ; ATL COM 物件的基本原則 ; 建立彙總

屬性

文章編號: 173823 - 上次校閱: 2004年6月29日 - 版次: 3.1
這篇文章中的資訊適用於:
  • Microsoft ActiveX Template Library 3.0?應用於:
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft ActiveX Template Library 2.1?應用於:
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
關鍵字:?
kbmt kbarchitecture kbhowto KB173823 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:173823
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com