Condividi tramite


CComObjectRootEx::FinalConstruct

È possibile eseguire l'override di questo metodo nella classe derivata per eseguire le inizializzazioni richieste per l'oggetto.

HRESULT FinalConstruct( );

Valore restituito

S_OK di ritorno sulla riuscita o in uno dei valori HRESULT di errore standard.

Note

Per impostazione predefinita, CComObjectRootEx::FinalConstruct restituisce semplicemente S_OK.

Presenta alcuni vantaggi a eseguire l'inizializzazione in FinalConstruct anziché il costruttore della classe:

  • Non è possibile restituire un codice di stato da un costruttore, ma è possibile restituire HRESULT per l'utilizzo di valore restituito di FinalConstruct. Quando gli oggetti della classe vengono create utilizzando class factory standard fornito da ATL, questo valore restituito viene propagato al client COM che consente di ottenere tali informazioni dettagliate sull'errore.

  • Non è possibile chiamare funzioni virtuali tramite il meccanismo di funzione virtuale dal costruttore di classe. Chiamare una funzione virtuale dal costruttore di classe comporta una chiamata risolto staticamente alla funzione come è stato definito in tale posizione nella gerarchia di ereditarietà. Le chiamate alle funzioni virtuali e generano errori del linker.

    La classe non è la classe derivata nella gerarchia di ereditarietà — utilizza una classe derivata fornita da ATL per fornire alcuna delle relative funzionalità. È consigliabile possibilità che il inizializzazione dovrà utilizzare le funzionalità fornite dalla classe (è sicuramente true se gli oggetti della classe deve aggregare altri oggetti), ma il costruttore della classe non è possibile accedere a queste funzionalità. Il codice della costruzione per la classe viene eseguito prima che la classe derivata sia completamente costruita.

    Tuttavia, FinalConstruct viene chiamato immediatamente dopo la classe derivata è completamente costruita che consente alle funzioni virtuali di chiamata e utilizza l'implementazione di conteggio dei riferimenti fornita da ATL.

Esempio

In genere, eseguire l'override del metodo nella classe derivata da CComObjectRootEx per creare tutti gli oggetti aggregati. Di seguito è riportato un esempio:

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 la compilazione non riesce, è possibile restituire un errore. È inoltre possibile utilizzare la macro DECLARE_PROTECT_FINAL_CONSTRUCT per proteggere l'oggetto esterno dall'eliminazione se, durante la creazione, l'oggetto aggregato interno incrementa il conteggio dei riferimenti quindi decrementa il conteggio a 0.

Di seguito viene illustrata la modalità tipica creare un'aggregazione:

  • Aggiungere un puntatore IUnknown all'oggetto di classe e inizializzarlo a NULL nel costruttore.

  • Eseguire l'override FinalConstruct per creare aggregato.

  • Utilizzare il puntatore IUnknown definito come parametro alla macro COM_INTERFACE_ENTRY_AGGREGATE.

  • Override FinalRelease per rilasciare il puntatore IUnknown.

Requisiti

Header: atlcom.h

Vedere anche

Riferimenti

CComObjectRootEx Class

CComObjectRootEx::FinalRelease

DECLARE_GET_CONTROLLING_UNKNOWN