CComObjectRootEx::FinalConstruct

 

Veröffentlicht: Juli 2016

Sie können diese Methode in der abgeleiteten Klasse überschreiben, jede Initialisierung auszuführen, die für das Objekt benötigt wird.

Syntax

HRESULT FinalConstruct( );

Rückgabewert

Gibt S_OK bei Erfolg oder einen der HRESULT-Standardfehlerwerte zurück.

Hinweise

Standardmäßig gibt CComObjectRootEx::FinalConstruct einfach S_OK zurück.

Es gibt Vorteile zur Ausführung von Initialisierung in FinalConstruct anstelle der Konstruktor der Klasse:

  • Sie können einen Statuscode von einem Konstruktor nicht zurückgeben, aber Sie können HRESULT mithilfe des Rückgabewerts von FinalConstruct zurückgeben. Wenn Objekte der Klasse mithilfe der Standardklassenfactorys erstellt werden, die von ATL bereitgestellt wird, wird dieser Rückgabewert an den COM-Clients weitergegeben, die Ihnen ermöglicht, sie mit ausführlichen Fehlerinformationen zu bieten.

  • Sie können virtuelle Funktionen nicht vom virtuellen Funktionsmechanismus vom Konstruktor einer Klasse aufrufen. Durch Aufrufen einer virtuellen Funktion vom Konstruktor einer Klasse führt einen statisch aufgelösten Aufruf der Funktion, während sie an diesem Punkt in der Vererbungshierarchie definiert ist. Aufrufe der rein virtuellen Funktionen führen Linkerfehler.

    Die Klasse ist nicht die meisten abgeleitete Klasse in der Vererbungshierarchie - sie basiert auf einer abgeleiteten Klasse, die über ATL angegeben wird, um einige von seiner Funktionalität bereitzustellen. Es gibt eine gute Möglichkeit, dass die Initialisierung die Funktionen verwenden muss, die von dieser Klasse bereitgestellt werden (diese ist zweifellos wahr, wenn Objekte der Klasse andere Objekte aggregieren müssen), aber der Konstruktor in der Klasse hat keine Möglichkeit, auf diese Funktionen zuzugreifen. Der Konstruktionscode für die Klasse wird ausgeführt, bevor die meisten abgeleitete Klasse vollständig erstellt wird.

    wird jedoch FinalConstruct aufgerufen, unmittelbar nachdem die meisten abgeleitete Klasse vollständig Weise lässt, um virtuelle Funktionen aufzurufen und die Verweiszählungsimplementierung verwenden erstellt wird, die von ATL bereitgestellt wird.

Beispiel

In der Regel überschreiben Sie diese Methode in der Klasse, die von CComObjectRootEx abgeleitet wird, um alle zusammengesetzten Objekte zu erstellen. Beispiel:

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.

Wenn die Konstruktion fehlschlägt, können Sie einen Fehler zurückgeben. Sie können das Makro DECLARE_PROTECT_FINAL_CONSTRUCT auch verwenden, um das äußere Objekt von gelöscht werden zu schützen, wenn, während der Erstellung, das interne zusammengesetzte Objekt erhöht, den Verweiszähler dann die Anzahl auf 0 verringert.

Im Folgenden finden Sie eine typische Methode, ein Aggregat zu erstellen:

  • Fügen Sie einen IUnknown Zeiger dem Klassenobjekt hinzu und initialisieren Sie ihn zu NULL im Konstruktor.

  • Überschreiben Sie FinalConstruct, um das Aggregat zu erstellen.

  • Verwenden Sie den IUnknown Zeiger, den Sie als - Parameter an den COM_INTERFACE_ENTRY_AGGREGATE-Makro definiert haben.

  • Überschreiben FinalRelease, um das IUnknown Zeigers freizugeben.

Anforderungen

Header: möchten

Siehe auch

CComObjectRootEx Class
CComObjectRootEx::FinalRelease
DECLARE_GET_CONTROLLING_UNKNOWN