如何聚合具有 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 对象的基础知识、 创建一个聚合

属性

文章编号: 173823 - 最后修改: 2004年6月29日 - 修订: 3.1
这篇文章中的信息适用于:
  • Microsoft ActiveX Template Library 3.0?当用于
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 5.0 专业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 标准版
    • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft ActiveX Template Library 2.1?当用于
    • Microsoft Visual C++ 5.0 企业版
    • Microsoft Visual C++ 6.0 企业版
    • Microsoft Visual C++ 5.0 专业版
    • Microsoft Visual C++ 6.0 专业版
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 标准版
    • Microsoft Visual C++ .NET 2003 Standard Edition
关键字:?
kbmt kbarchitecture kbhowto KB173823 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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