Partilhar via


CComObjectRootEx::FinalConstruct

Você pode substituir esse método em sua classe derivada para executar qualquer inicialização exigida para o objeto.

HRESULT FinalConstruct( );

Valor de retorno

RetornarS_OK no sucesso ou em um de erro padrão HRESULT valores.

Comentários

Por padrão, CComObjectRootEx::FinalConstruct simplesmente retorna S_OK.

Há vantagens em executando inicialização em FinalConstruct em vez do construtor da classe:

  • Não é possível retornar um código de status de um construtor, mas você pode retornar um HRESULT por meio de FinalConstructdo valor retornado. Quando objetos de sua classe estão sendo criados usando a fábrica de classes padrão fornecida pelo ATL, esse valor retornado é propagado para o cliente COM permitindo que você fornecer informações detalhadas do erro.

  • Não é possível telefonar funções virtuais através do mecanismo de função virtual do construtor de uma classe.Chamando uma função virtual do construtor de uma classe resultados em uma telefonar resolvida estaticamente para a função sistema autônomo é definida a partir desse ponto na hierarquia de herança.Chamadas para funções virtual puras resultam em erros de vinculador.

    A classe não é mais derivados da classe na hierarquia de herança — depende de uma classe derivada fornecida pelo ATL para fornecer alguns sua funcionalidade.Há uma mercadoria chance de que sua inicialização será necessário usar os recursos oferecidos por essa classe (isso é certamente verdadeiro quando os objetos da sua classe precisam agregar outros objetos), mas o construtor em sua classe não tem como acessar esses recursos.O código de construção para sua classe é executado antes de mais classe derivada foi totalmente construído.

    No entanto, FinalConstruct é telefonar ed imediatamente após mais derivado classe totalmente é construído, permitindo que você telefonar funções virtual e usar a implementação de contagem de referência fornecida pelo ATL.

Exemplo

Normalmente, substituir esse método na classe derivada de CComObjectRootEx Para criar qualquer agregados objetos. Por exemplo:

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.

Se a construção falhar, você pode retornar um erro.Você também pode usar a macro DECLARE_PROTECT_FINAL_CONSTRUCT para proteger seu externa do objeto seja excluído se, durante a criação, o objeto agregado interno incrementa a contagem de referência e diminui a contagem como 0.

Eis uma forma típica para criar uma agregação:

  • Adicionar um IUnknown ponteiro para a classe objeto e inicializá-lo para NULO no construtor.

  • Substituir FinalConstruct Para criar o agregado.

  • Use o IUnknown ponteiro definido sistema autônomo o parâmetro para o COM_INTERFACE_ENTRY_AGGREGATE macro.

  • Substituir FinalRelease Para liberar o IUnknown ponteiro.

Requisitos

Cabeçalho: atlcom.h

Consulte também

Referência

Classe CComObjectRootEx

CComObjectRootEx::FinalRelease

DECLARE_GET_CONTROLLING_UNKNOWN

Outros recursos

CComObjectRootEx membros