實作物件建立延伸模組 COM 物件

物件建立延伸模組是實作為內部伺服器之 COM 物件。 主要和次要物件建立延伸模組都必須實作標識碼 管理員 NewObjExt 介面。

實作標識碼 管理員 NewObjExt

建立物件建立精靈時,它會呼叫延伸模組的標識碼 管理員 NewObjExt::Initialize 方法,初始化每個物件建立延伸模組。 Initialize 方法會提供擴充功能,其中包含正在建立物件之容器的相關信息、新對象的類別名稱,以及精靈本身的相關信息。 如果物件建立精靈開始從現有物件建立新的物件, pADsCopySource 參數將不會是 NULL。 在此情況下,延伸模組應該嘗試從複製的物件取得盡可能多的數據。

初始化延伸模組之後,會呼叫標識符 管理員 NewObjExt::AddPages 方法。 擴充功能必須在此方法期間將頁面或頁面新增至精靈。 精靈頁面的建立方式是填入 PROPSHEETPAGE 結構,然後將這個結構傳遞至 CreatePropertySheetPage 函式。 接著,呼叫傳遞至 lpfnAddPage 參數中 AddPages回調函式,以將頁面新增至精靈。

在顯示延伸模組頁面之前,會呼叫標識符 管理員 NewObjExt::SetObject 這會為所建立的物件提供 IADs 介面指標的延伸模組。

顯示精靈頁面時,頁面應該處理並回應任何必要的精靈通知訊息,例如PSN_SETACTIVEPSN_WIZNEXT。

當使用者完成所有精靈頁面時,精靈會顯示一個「完成」頁面,提供所輸入數據的摘要。 精靈會針對每個延伸模組呼叫標識符 管理員 NewObjExt::GetSummaryInfo 方法來取得此數據。 GetSummaryInfo 方法會提供 BSTR,其中包含顯示在 [完成] 頁面中的文字數據。 物件建立延伸模組不需要提供摘要數據。 在此情況下, GetSummaryInfo 應該傳回 E_NOTIMPLGetSummaryInfo 只會針對每個延伸模組呼叫一次,而不是每個頁面,因此,如果物件建立延伸模組新增了一個以上的頁面,擴充功能必須將摘要數據合併成一個字符串。

當使用者按兩下 [完成] 頁面中的 [完成] 按鈕時,精靈會使用DSA_NEWOBJ_CTX_PRECOMMIT內容呼叫每個擴充功能的標識符 管理員 NewObjExt::WriteData 方法。 發生這種情況時,擴充功能應該使用 IADs::P ut IADs::P utEx 方法,將數據寫入適當的屬性。 IADs 介面會提供給標識碼 管理員 NewObjExt::SetObject 方法中的延伸模組。 延伸模組不應該藉由呼叫 IADs::SetInfo 來認可快取的屬性。 寫入所有屬性之後,主要物件建立延伸模組會呼叫 IADs::SetInfo來認可變更。 下面會更詳細地討論這一點。

如果發生錯誤,擴充功能將會收到錯誤通知,並在呼叫標識碼 管理員 NewObjExt::OnError 方法時發生該錯誤。

實作主要物件建立精靈

主要物件建立精靈的實作與次要物件建立精靈相同,不同之處在於主物件建立精靈必須執行幾個更多步驟。

在關閉第一頁之前,物件建立精靈必須建立暫存目錄物件。 若要這樣做,請呼叫標識符 管理員 NewObjPrimarySite::CreateNew 方法。 呼叫 QueryInterface 搭配 IDs IID_IDs管理員 NewObjPrimarySite 的標識符 管理員 NewObjPrimarySite 介面的指標 管理員 NewObj 介面會傳遞至標識符 管理員 NewObjExt::Initialize 來取得。 CreateNew 方法會建立新的暫存物件,並針對每個延伸模塊呼叫標識碼 管理員 NewObjExt::SetObject

當物件建立精靈包含一個以上的頁面時,系統會實作「完成」頁面,以顯示要儲存之對象資訊的摘要。 按兩下 [完成] 頁面上的 [完成] 按鈕時,系統會呼叫每個物件建立延伸模組的標識碼 管理員 NewObjExt::WriteData 方法,然後將暫存對象認可至持續性記憶體。 不過,如果物件建立精靈只包含一個頁面,則頁面將會有 [確定] 和 [取消] 按鈕,而不是在精靈中通常找到的 [下一步] 和 [取消] 按鈕,而且未提供 [完成] 頁面。 因此,單頁物件建立延伸模組精靈必須呼叫標識符 管理員 NewObjPrimarySite::Commit 來執行寫入和儲存作業。 單頁主要物件建立延伸模組應該呼叫 Commit 來回應 PSN_WIZFINISH 通知。

因為其他物件建立延伸模組可以將頁面新增至精靈,因此主要物件建立延伸模組可能不知道精靈中是否有一個以上的頁面。 這不是有兩個原因的問題:首先,如果系統實作 [完成] 頁面,主要物件建立延伸模組會收到 PSN_WIZNEXT 通知,而不是 PSN_WIZNEXT 通知。 其次,如果精靈包含一個以上的頁面, 認可 將會無害地失敗。