Udostępnij za pośrednictwem


CComObjectRootEx::FinalConstruct

Można zastąpić tę metodę w klasie pochodnej wykonywanie inicjalizacji, wszelkie wymagane dla obiektu.

HRESULT FinalConstruct( );

Wartość zwracana

Zwraca S_OK na sukces lub jeden standardowy błąd HRESULT wartości.

Uwagi

Domyślnie CComObjectRootEx::FinalConstruct po prostu zwraca S_OK.

Istnieją zalety Trwa inicjalizacja w FinalConstruct zamiast konstruktora klasy:

  • Kod stanu nie może zwrócić z konstruktora, ale można zwrócić HRESULT za FinalConstruct's zwracają wartość.Obiekty klasy tworzonych jest fabryczna klasa standardowych, świadczone przez ATL, zwrócona wartość jest propagowany do klienta COM, umożliwiając dostarczyć szczegółowe informacje o błędzie.

  • Nie można wywołać funkcji wirtualnych za pośrednictwem mechanizmu funkcję wirtualną z konstruktora klasy.Wywołanie funkcji wirtualnych z konstruktora klasy wyników statycznie rozwiązane wywołanie funkcji, jak jest zdefiniowany w tym punkcie w hierarchii dziedziczenia.Wywołania funkcji wirtualnych czystego spowodować błędy programu łączącego.

    Klasa nie jest najbardziej pochodna klasy w hierarchii dziedziczenia — opiera się na klasie pochodnej dostarczonych przez ATL, aby udostępnić niektóre jego funkcje.Istnieje szansa, że inicjowania programu, należy użyć funkcji zapewnianych przez klasy (jest to pewnością obiektów klasy musi być agregacji inne obiekty), ale konstruktora klasy użytkownika ma nie sposób dostępu do tych funkcji.Kod klasy budowy jest wykonywane przed najbardziej pochodna klasy jest całkowicie skonstruowane.

    Jednakże FinalConstruct nazywa się natychmiast po najbardziej uzyskane klasy jest pełni zbudowane, umożliwiając wywoływać funkcje wirtualnych i Użyj liczenia odniesienia wykonania dostarczonych przez ATL.

Przykład

Zastępują tej metody w klasie pochodzące z CComObjectRootEx tworzyć żadnych zagregowane obiektów.Na przykład:

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.

Jeżeli konstrukcja nie powiedzie się, może zwracać błąd.Można również użyć makra DECLARE_PROTECT_FINAL_CONSTRUCT do ochrony przed zewnętrzne obiekt usunięty, jeśli podczas tworzenia obiektu wewnętrznego zagregowane zwiększa liczbę odwołań następnie zmniejsza licznik 0.

Oto typowy sposób utworzyć zagregowane:

  • Dodaj IUnknown wskaźnik do klasy obiektów i zainicjować ją do NULL w konstruktorze.

  • Zastąpić FinalConstruct utworzyć agregacji.

  • Użyj IUnknown wskaźnik zdefiniowane jako parametr do COM_INTERFACE_ENTRY_AGGREGATE makro.

  • Zastąpić FinalRelease do wydania IUnknown wskaźnik.

Wymagania

Nagłówek: atlcom.h

Zobacz też

Informacje

Klasa CComObjectRootEx

CComObjectRootEx::FinalRelease

DECLARE_GET_CONTROLLING_UNKNOWN