Sdílet prostřednictvím


CComObjectRootEx::FinalConstruct

Tuto metodu lze přepsat v provést libovolnou inicializaci požadované pro objekt odvozené třídy.

HRESULT FinalConstruct( );

Vrácená hodnota

Vrátit S_OK na úspěchu nebo jednu standardní chyby HRESULT hodnoty.

Poznámky

Ve výchozím nastavení CComObjectRootEx::FinalConstruct jednoduše vrátí S_OK .

Přináší výhody na provedení inicializace v FinalConstruct místo konstruktoru třídy:

  • Nelze vrátit stav kódu z konstruktoru, ale můžete se vrátit HRESULT prostřednictvím FinalConstruct a vrátit hodnotu.Jestliže objekty třídy jsou vytvářeny pomocí standardních tříd poskytovaných ATL, rozšíří se tuto hodnotu zpět klientovi COM umožňuje poskytnout podrobné informace o chybě.

  • Funkce virtuální nelze volat prostřednictvím mechanismu virtuální funkce z konstruktoru třídy.Volání virtuální funkce konstruktoru třídy z výsledků staticky vyřešen volání funkce, jak je definován v tomto bodě v hierarchii dědičnosti.Volání funkcí čistého virtuální způsobit chyby.

    Třída není většina odvozené třídy v hierarchii dědičnosti – vychází odvozené třídy poskytnutých ATL poskytnout některé jeho funkce.Je dobré pravděpodobné, že vaše Inicializace bude třeba použít funkce poskytované třídy (to platí jistě při objekty třídy nutné agregovat jiných objektů), ale ve své třídě konstruktor nemůže nijak přístupu k nim.Konstrukce kódu pro třídu proveden před nejvíce odvozené třídy je zcela vyrobeno.

    Však FinalConstruct se nazývá okamžitě po nejvíce odvozené třídy je plně vyrobeno umožňuje volat funkce virtuální a použijte počítání odkazů provádění poskytované ATL.

Příklad

Obvykle přepsat tuto metodu třídy odvozené od CComObjectRootEx k vytvoření libovolné agregované objekty.Příklad:

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.

Pokud konstrukce nezdaří, můžete vrátit chybu.Můžete také použít makro DECLARE_PROTECT_FINAL_CONSTRUCT chránit před přičemž vnější objekt odstraněn, pokud při vytváření vnitřní agregovaný objekt zvýší počet odkazů a sníží počet na 0.

Zde je obvyklým způsobem vytvořit agregační:

  • Přidat IUnknown ukazatel do třídy objektu a jeho inicializaci NULL v konstruktoru.

  • Přepsat FinalConstruct vytvořit agregační funkci.

  • Použití IUnknown definován jako parametr ukazatele COM_INTERFACE_ENTRY_AGGREGATE makro.

  • Přepsat FinalRelease vydat IUnknown ukazatel.

Požadavky

Záhlaví: atlcom.h

Viz také

Referenční dokumentace

Třída CComObjectRootEx

CComObjectRootEx::FinalRelease

DECLARE_GET_CONTROLLING_UNKNOWN