CComObjectRootEx::FinalConstruct
、オブジェクトに必要な初期化を実行するために派生クラスでこのメソッドをオーバーライドできます。
構文
HRESULT FinalConstruct( );
戻り値
標準エラー出力 HRESULT の値の成功または 1 個の戻り値の S_OK。
解説
既定では、CComObjectRootEx::FinalConstruct は S_OKを返します。
クラスのコンストラクターはなく FinalConstruct で初期化することによる利点があります:
コンストラクターからステータス コードを返すことができません FinalConstruct の戻り値を使用して HRESULT を返すことができます。 クラスのオブジェクトが ATL の標準クラス ファクトリを使用して作成する場合は、この戻り値は、COM クライアントに戻され、詳細なエラー情報と、これらの提供を許可します。
クラスのコンストラクターから仮想関数機構を通じて仮想関数を呼び出すことはできません。 クラスのコンストラクターから仮想関数を呼び出すと、関数に静的に解決された呼び出しで継承階層でその時点で定義されると発生します。 純粋仮想関数の呼び出しはリンカー エラーが発生します。
このクラスは継承階層の最派生クラスではありません。機能の一部を提供することで、ATL によって提供される派生クラスに依存しています。 クラスのオブジェクトが他のオブジェクトを集約する必要がある場合、初期化が (これは確実に該当します)、そのクラスに用意されている機能を使用する必要があるが、クラスのコンストラクターは、その機能にアクセスする方法はありません。ということができます。 クラスのコード構造体は、最派生クラスが完全に構築される前に実行されます。
ただし、FinalConstruct が呼び出され、最派生クラスが完全に構築された直後に仮想関数を呼び出し、ATL によって提供される参照カウントの実装を使用できるようにします。
使用例
通常、集約オブジェクトを作成するに CComObjectRootEx の派生クラスでこのメソッドをオーバーライドします。 以下はその例です。
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.
構造体が失敗した場合は、エラーを返すことができます。 、作成時に、内部集約オブジェクトが 0 に参照カウントをデクリメントした場合、カウントをインクリメントしてから、削除などの外部オブジェクトを保護するには、マクロ DECLARE_PROTECT_FINAL_CONSTRUCT を使用できます。
集計を作成する一般的な方法を次に示します。:
IUnknown のポインターをクラスに追加し、オブジェクトのコンストラクター null で要素を初期化します。
集計を作成するに FinalConstruct をオーバーライドします。
、COM_INTERFACE_ENTRY_AGGREGATE のマクロにパラメーターとして IUnknown のポインターを使用します。
IUnknown のポインターを解放するためにオーバーライド FinalRelease。
必要条件
ヘッダー: atlcom.h
参照
CComObjectRootEx クラス
CComObjectRootEx::FinalRelease
DECLARE_GET_CONTROLLING_UNKNOWN