Compartir a través de


CComObjectRootEx::FinalConstruct

Puede reemplazar este método en la clase derivada para realizar cualquier inicialización requerida para el objeto.

HRESULT FinalConstruct( );

Valor devuelto

S_OK return en correctamente o uno de los valores de HRESULT de error estándar.

Comentarios

De forma predeterminada, CComObjectRootEx::FinalConstruct simplemente devuelve S_OK.

Hay ventajas a realizar la inicialización en FinalConstruct en lugar del constructor de la clase:

  • No puede devolver un código de estado de un constructor, pero puede devolver HRESULT mediante el valor devuelto de los entity_FinalConstruct.Cuando los objetos de clase se crean mediante el generador estándar de la clase proporcionada por ATL, este valor devuelto se propaga de nuevo al cliente COM permitiendo que se proporciona con información de error detallada.

  • No puede llamar a funciones virtuales a través del mecanismo virtual de la función de constructor de una clase.Llamar a una función virtual del constructor de una clase produce una llamada estáticamente resuelto a la función como se define en ese momento en la jerarquía de herencia.Las llamadas a funciones virtuales puras dan lugar a errores del vinculador.

    La clase no es la clase más derivada en la jerarquía de herencia — se basa en una clase derivada proporcionada por ATL para proporcionar parte de su funcionalidad.Hay una buena oportunidad que la inicialización necesario usar las características proporcionadas por esa clase (es siempre true cuando los objetos de la clase necesitan agregar otros objetos), pero el constructor en la clase no tiene forma de obtener acceso a esas características.El código de la construcción de la clase se ejecuta antes de que la clase derivada se construye totalmente.

    Sin embargo, se llama a FinalConstruct inmediatamente después de que la clase derivada se construye totalmente permite llamar a funciones virtuales y utilizar la implementación del recuento de referencias proporcionada por ATL.

Ejemplo

Normalmente, invalide este método en la clase derivada de CComObjectRootEx para crear cualquier objeto agregado.Por ejemplo:

class ATL_NO_VTABLE CMyAggObject :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyAggObject, &CLSID_MyAggObject>,
   public IDispatchImpl<IMyAggObject, &IID_IMyAggObject, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   DECLARE_GET_CONTROLLING_UNKNOWN()
   HRESULT FinalConstruct()
   {
      return CoCreateInstance(CLSID_MyCustomClass, GetControllingUnknown(), 
         CLSCTX_ALL, IID_IUnknown, (void**)&m_pMyCustomClass);
   }

   IMyCustomClass* m_pMyCustomClass;

   // Remainder of class declaration omitted.

Si se produce un error en la construcción, puede devolver un error.También puede utilizar la macro DECLARE_PROTECT_FINAL_CONSTRUCT para proteger el objeto externo de eliminar si, durante la creación, el objeto agregado interno incrementa el recuento de referencias después disminuye el recuento en 0.

A continuación se muestra una manera típica de crear un agregado:

  • Agregue un puntero de IUnknown al objeto de la clase e inicialícela a NULL en el constructor.

  • Reemplace FinalConstruct para crear el agregado.

  • Utilice el puntero de IUnknown se define como parámetro a la macro de COM_INTERFACE_ENTRY_AGGREGATE .

  • Reemplazo FinalRelease para liberar el puntero de IUnknown .

Requisitos

encabezado: atlcom.h

Vea también

Referencia

Clase de CComObjectRootEx

CComObjectRootEx::FinalRelease

DECLARE_GET_CONTROLLING_UNKNOWN