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
CComObjectRootEx::FinalRelease
DECLARE_GET_CONTROLLING_UNKNOWN