Cómo agregar un objeto COM con ATL

Seleccione idioma Seleccione idioma
Id. de artículo: 173823 - Ver los productos a los que se aplica este artículo
Nota Microsoft Visual C++ .NET (2002) admite el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows. La información de este artículo sólo se aplica al código no administrado de Visual C++.
Expandir todo | Contraer todo

En esta página

Resumen

Los pasos siguientes demuestran cómo agregar un COM objeto en un proyecto ATL:
  1. Agregar un puntero IUnknown a su objeto de clase e inicialícelo a NULL en el constructor.
  2. Agregar la macro DECLARE_PROTECT_FINAL_CONSTRUCT para evitar que el objeto se eliminará si (durante FinalConstruct) el objeto interno agregado incrementa el recuento de referencia después disminuye el recuento a 0.

    Nota : si está utilizando Visual C++ .NET el Asistente para esto agrega para usted.
  3. Utilice el puntero IUnknown que definido como el segundo parámetro a las macros COM_INTERFACE_ENTRY_AGGREGATE. El primer parámetro es el IID de la interfaz del objeto interno que se desea exponer.
  4. Reemplazar FinalConstruct() para crear el agregado.
  5. Reemplazar FinalRelease() para liberar el IUnknown de puntero.

Más información

Si usa y libera una interfaz del agregado durante FinalConstruct, debe agregar la macro DECLARE_PROTECT_FINAL_CONSTRUCT a la definición de su objeto de clase.

Aquí es un ejemplo con cuatro de los pasos que realiza en la definición de clase. Esto es un objeto simple, COutObj, que agrega otro objeto simple CInnObj.

Código de ejemplo

   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
   };
				
Si es el objeto interno en el mismo servidor ATL, puede utilizar el código siguiente para crear el objeto interno sin CoCreateInstance:
   HRESULT FinalConstruct()
      {
         return  CInnObj::_CreatorClass::CreateInstance(
             GetControllingUnknown(), IID_IUnknown,
             (void**)&m_pInnerUnk);

      }
				

Referencias

Visuales C++ libros en pantalla: de libros de Visual C++; lenguaje de C o C++ y biblioteca de C++; Active Template Library artículos Introducción a COM y ATL; Introducción a COM; agregar

Visuales C++ libros en pantalla: de libros de Visual C++; lenguaje de C o C++ y biblioteca de C++; Active Template Library artículos Fundamentos de los objetos ATL COM; crear un agregado

Propiedades

Id. de artículo: 173823 - Última revisión: martes, 29 de junio de 2004 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft ActiveX Template Library 3.0 sobre las siguientes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard
    • Microsoft Visual C++ .NET 2003 Standard
  • Microsoft ActiveX Template Library 2.1 sobre las siguientes plataformas
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft Visual C++ .NET 2002 Standard
    • Microsoft Visual C++ .NET 2003 Standard
Palabras clave: 
kbmt kbarchitecture kbhowto KB173823 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 173823

Enviar comentarios

 

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