CComObjectRootEx::FinalConstruct
您可以覆寫衍生類別中實作此方法以您的物件所需的任何初始化。
HRESULT FinalConstruct( );
傳回值
在成功或其中一個傳回 S_OK 標準錯誤 HRESULT 值。
備註
根據預設, CComObjectRootEx::FinalConstruct 傳回 S_OK。
有一個好處執行初始化。 FinalConstruct 而不是類別的建構函式:
您無法從建構函式傳回的狀態碼,不過,您可以 entity_CODEFinalConstruct 的傳回值會傳回 HRESULT 。 當您的類別建立物件時使用 ATL 提供的標準 Class Factory,則傳回值會傳回至 COM 用戶端可以讓您提供使用者的詳細錯誤訊息。
您無法透過繼承自類別的建構函式呼叫虛擬函式機制呼叫虛擬函式。 表示處於繼承階層架構,則定義會從類別的建構函式呼叫虛擬函式會產生具有以統計方式解析的呼叫函式。 為純虛擬函式的呼叫會產生連結器錯誤。
您的類別不是繼承階層架構的大部分衍生類別—它依賴 ATL 提供的衍生類別 (Derived Class) 提供其部分功能。 有很可能您的初始化需要使用這個類別提供的功能 (這必須是 true,當您的類別物件需要其他彙總物件) 時,不過,在您的類別的建構函式無法存取這些功能。 在大多數的衍生類別完整地建構之前,您的類別中建構程式碼執行。
不過,在這種情況下,大多數的衍生類別完整地建構可以讓您呼叫虛擬函式使用 ATL 和之後,提供之參考次數的實作 FinalConstruct 呼叫。
範例
通常,請覆寫 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 。
需求
Header: atlcom.h