如何聚合具有 ATL 的 COM 对象

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 173823
本文已归档。它按“原样”提供,并且不再更新。
注意Microsoft Visual c + +.net (2002) 支持托管的代码模型所提供的 Microsoft.net 框架和非托管本机 Windows 代码模型。本文中的信息仅适用于非托管的 Visual c + + 代码。
概要
下面的步骤演示了如何聚合一个 COM 对象在 ATL 项目中的:
  1. 将一个 IUnknown 指针添加到您的类对象,并在构造函数中将其初始化为 NULL。
  2. 添加 DECLARE_PROTECT_FINAL_CONSTRUCT 宏保护您的对象被删除,如果在 FinalConstruct) 期间内部聚集的对象递增然后,此引用计数递减计数为 0。

    : 如果您正在使用 Visual c + +.net 向导添加这为您。
  3. 使用您定义为第二个参数为 COM_INTERFACE_ENTRY_AGGREGATE 宏 IUnknown 指针。第一个参数是接口的要公开的内部对象的 IID。
  4. 重写 FinalConstruct() 创建聚合。
  5. 重写释放,IUnknown FinalRelease() 指针。
更多信息
如果使用,并释放一个接口从聚合 FinalConstruct 期间应将 DECLARE_PROTECT_FINAL_CONSTRUCT 宏添加到您的类对象的定义。

下面是一个示例与所有这四个在类定义中完成这些步骤。这是一个简单的对象 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) // 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 对象的基础知识、 创建一个聚合

派生重写 kbATL210 kbATL300 kbctrl kbserver

警告:本文已自动翻译

属性

文章 ID:173823 - 上次审阅时间:12/04/2015 17:50:49 - 修订版本: 3.1

Microsoft ActiveX Template Library 3.0, Microsoft ActiveX Template Library 2.1

  • kbnosurvey kbarchive kbmt kbarchitecture kbhowto KB173823 KbMtzh
反馈