Compartilhar via


CComObjectRootEx::FinalConstruct

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

HRESULT FinalConstruct( );

Valor de retorno

S_OK de retorno em êxito ou em um dos valores de HRESULT de erro padrão.

Comentários

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

Há vantagens de executar a inicialização em FinalConstruct em vez do construtor de classe:

  • Você não pode retornar um código de status de um construtor, mas você pode retornar HRESULT por meio do valor de retorno de FinalConstruct.Quando os objetos de sua classe estão sendo criados usando o factory de classe padrão fornecida por ATL, esse valor de retorno é propagado de volta para o cliente COM permitindo que você fornece informações de erro detalhada.

  • Você não pode chamar funções virtuais pelo mecanismo virtual da função de construtor de uma classe.Chamar uma função de construtor virtual de uma classe resulta em uma chamada estaticamente resolvido para a função como é definido em esse ponto na hierarquia de herança.Chamadas a funções virtuais puras levam a erros de vinculador.

    A classe não é a maioria de classe derivada na hierarquia de herança — se baseia em uma classe derivada fornecida por ATL para fornecer alguma de sua funcionalidade.Há uma boa possibilidade que sua inicialização precisará usar os recursos fornecidos pela classe (isso é verdadeira certamente quando os objetos de sua classe precisam agregar outros objetos), mas o construtor na classe não tem nenhuma maneira para acessar os recursos.O código de compilação para a classe é executado antes que a maioria de classe derivada é construída inteiramente.

    Em o entanto, FinalConstruct é chamado imediatamente após a maioria de classe derivada é construída totalmente permitindo que você chamar funções virtuais e use a implementação de contagem fornecida por ATL.

Exemplo

Normalmente, substitua esse método na classe derivada de CComObjectRootEx para criar todos os objetos agregados.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 compilação falhar, você pode retornar um erro.Você também pode usar a macro DECLARE_PROTECT_FINAL_CONSTRUCT para proteger o objeto externo de ser excluído, se durante a criação, o objeto agregado interno incrementa contagem de referência diminui a contagem a 0.

Aqui está uma maneira comum para criar uma agregação:

  • Adicione um ponteiro de IUnknown ao objeto da classe e inicializá-la a NULO no construtor.

  • Substitua FinalConstruct para criar uma agregação.

  • Use o ponteiro de IUnknown que você definiu como o parâmetro como a macro de COM_INTERFACE_ENTRY_AGGREGATE .

  • Substituição FinalRelease para liberar o ponteiro de IUnknown .

Requisitos

Cabeçalho: atlcom.h

Consulte também

Referência

Classe de CComObjectRootEx

CComObjectRootEx::FinalRelease

DECLARE_GET_CONTROLLING_UNKNOWN