Share via


使用者驅動安裝 - 開發人員指南

使用者驅動安裝 (UDI) 可協助簡化將 Windows® 用戶端作業系統,例如 Windows 8.1 部署到使用操作系統部署的電腦, (Microsoft® System Center 2012 R2 Configuration Manager 中的 OSD) 功能。 UDI 是 Microsoft Deployment Toolkit (MDT) 的一部分。

簡介

一般而言,使用 OSD 功能部署作業系統時,您必須提供部署作業系統的所有必要資訊。 資訊是在組態檔或資料庫中設定, (例如 CustomSettings.ini 檔案或 MDT 資料庫 [MDT DB]) 。 您必須先提供所有組態設定,才能起始部署。

UDI 提供精靈驅動介面,可讓您在執行部署之前立即提供設定資訊。 此行為可讓您建立一般 OSD 工作順序,然後在部署時提供電腦特定資訊,以在部署程式中提供更大的彈性。

目標物件

本指南是針對為UDI Wizard建立自定義精靈頁面的開發人員所撰寫,以及針對UDI Wizard Designer 自定義精靈頁面編輯器所撰寫。 本指南假設您已熟悉使用下列項目開發 Windows 應用程式:

  • C++,用來建立自定義精靈頁面

  • Microsoft .NET Framework,用來建立自定義精靈頁面編輯器

  • Windows Presentation Foundation (WPF) ,用來建立自定義精靈頁面編輯器

  • WPF 支援的語言,例如 C#、C++或 Microsoft Visual Basic® .NET,可用來建立自定義精靈頁面編輯器

關於本指南

本指南提供必要的參考資訊,以協助您自定義組織的 UTI。 本指南不會討論系統管理或操作主題,例如安裝包含 UDI) 的 MDT (、設定 UDI 以部署作業系統和應用程式,或使用 UDI 精靈執行部署。 如需這些主題的詳細資訊,請參閱使用 MDT 隨附 的 Microsoft Deployment Toolkit 中的 UDI 主題。

UDI 開發概觀

UDI 開發可讓您擴充UDI提供的功能。 一般而言,當您想要收集UDI部署程式取用的其他資訊時,需要進行UDI開發。 這項額外資訊通常會儲存為工作順序變數,工作順序會在UDI工作順序中 Configuration Manager讀取。

UDI 架構

UDI 開發的高階目標是建立可在UDI精靈中顯示的自定義精靈頁面。 藉由建立自定義精靈頁面,您可以擴充 UDI 的現有功能,以符合組織的商務和技術需求。 自定義精靈頁面會收集UDI所提供之精靈頁面的或取代資訊。

圖 1 說明 UDI Wizard Designer 與 UDI Wizard 之間的關聯性。

圖 1.UDI Wizard 與 UDI Wizard 之間的關聯性 Designer 圖 1。 UDI Wizard 與 UDI Wizard Designer 之間的關聯性

圖 1: UDI Wizard 與 UDI Wizard Designer 之間的關聯性

在概念層級,UDI 開發包括建立:

  • 自定義精靈頁面。 精靈頁面會顯示在UDI精靈中,並收集完成部署程式所需的資訊。 您可以在 Microsoft Visual Studio® 中使用 C++ 建立精靈頁面。 自定義精靈頁面會實作為UDI精靈讀取的 DLL。 SDK (UDI 軟體開發工具組) 包含如何建立自定義精靈頁面的範例。

  • 自定義精靈頁面編輯器。 您可以使用精靈頁面編輯器來設定自訂精靈頁面的行為。 自定義精靈頁面編輯器會實作為 UDI 精靈 Designer 讀取的 DLL。 您可以使用下列專案建立精靈頁面編輯器:

    • WPF 4.0 版

    • Microsoft Prism 4.0 版

    • Microsoft Unity 應用程式區塊 (Unity) 2.1 版

      MDT 包含建立自定義精靈頁面編輯器以在 UDI Wizard Designer 中使用所需的所有元件。 UDI SDK 包含如何建立自定義精靈頁面編輯器的範例。

    此外,UDI Wizard Designer 會取用支援的精靈頁面編輯器組態檔。 您可以建立精靈頁面編輯器組態檔,作為建立自定義精靈頁面和自定義精靈頁面編輯器程式的一部分。 UDI Wizard Designer 會在 UDI Wizard 組態檔和對應的.app檔中建立必要的 XML 資訊。

準備UDI開發環境

開始建立您自己的自定義精靈頁面和精靈頁面編輯器之前,請執行下列步驟來準備 UDI 開發環境:

  1. 準備UDI開發環境必要條件,如 準備UDI開發環境必要條件中所述。

  2. 設定UDI開發環境,如設定 UDI開發環境中所述。

  3. 確認 UDI 開發環境已正確設定,如 驗證 UDI 開發環境中所述。

準備UDI開發環境必要條件

若要準備 UDI 開發環境必要條件,請執行下列步驟:

  1. 準備UDI開發環境硬體必要條件,如 準備UDI開發環境硬體必要條件中所述。

  2. 準備 UDI 開發環境軟體必要條件,如 準備 UDI 開發環境軟體必要條件中所述。

準備UDI開發環境硬體必要條件

UDI 開發環境硬體必要條件與您所使用之 Microsoft Visual Studio 版本的硬體需求相同。 如需這些需求的詳細資訊,請參閱 Visual Studio檔中的每個版本的系統需求。

準備 UDI 開發環境軟體必要條件

UDI 開發環境具有下列軟體必要條件:

  • 建議使用 Visual Studio 2010 支援的任何 Windows 操作系統 (Windows 7 或 Windows Server® 2008 R2。)

    您將需要支援要開發之處理器架構的 Windows 作業系統。 您可以使用 64 位作業系統執行 32 位和 64 位 UDI 開發。 您只會在 32 位作業系統上進行 32 位 UDI 開發。 因此,您應該使用 64 位作業系統。

    注意事項

    UDI 開發環境不支援 IA-64) Windows 作業系統 (IntelItanium 版本。

    如需 Visual Studio 2010 支援之作業系統的詳細資訊,請參閱 Visual Studio 檔中的每個版本的系統需求。

  • Visual Studio 2010) 所需的 Microsoft .NET Framework 4.0 (版

  • C++ 語言 (擴充 UDI 精靈頁面時所使用的語言)

  • WPF 支援的其他語言,例如 C#、Visual Basic .NET 或 C++/Common Language Infrastructure,可用來擴充精靈 Designer 精靈頁面編輯器

    注意事項

    UDI Wizard Designer 精靈頁面編輯器的範例原始碼是以 C# 撰寫。 如果您想要使用範例原始程式碼,請安裝 C# 語言。

設定UDI開發環境

在符合 UDI 開發環境必要條件之後,請執行下列步驟來設定 UDI 開發環境:

  1. 安裝 Visual Studio 2010。

    請確定您已安裝 C++ 語言和 WPF 支援的任何其他語言。

    注意事項

    UDI Wizard Designer 編輯器頁面的範例原始程式碼是以 C# 撰寫。 如果您想要使用範例原始程式碼,請安裝 C# 語言。

    如需安裝Visual Studio 2010的詳細資訊,請參閱 安裝Visual Studio

  2. 安裝 MDT。

    For more information about how to install MDT, see the section, "Installing or Upgrading to MDT", in the MDT document Using the Microsoft Deployment Toolkit.

  3. 在 Windows 檔案總管中,建立 local_folder (,其中 local_folder 位於開發電腦) 本機磁碟驅動器上的任何資料夾。

  4. installation_folder\SDK 資料夾複製到 local_folder (,其中 installation_folder 是您安裝 MDT 的資料夾, 而 local_folder 是位於開發電腦) 本機磁碟驅動器上的任何資料夾。

    您會將 SDK 資料夾複製到另一個位置,因為 MDT 已安裝在 Program Files 資料夾中,若沒有提高的許可權,就無法寫入該資料夾。 將 SDK 資料夾複製到另一個位置,可讓您修改 SDK 資料夾中的檔案,而不需要提高許可權。

  5. installation_folder\Templates\Distribution\Tools 資料夾複製到 local_folder (其中 installation_folder 是您安裝 MDT 的資料夾, 而 local_folder 是您稍早在程式) 中建立的資料夾。

  6. local_folder\Tools 資料夾重新命名為 local_folder\OSDSetupWizard (其中 local_folder 是您稍早在程式) 中建立的資料夾。

    完成時, local_folder 下的資料夾結構看起來應該像圖 2 (中所示的資料夾結構,其中 local_folder 是您稍早在程式中建立的資料夾,並在圖) 中顯示為 UDIDevelopment

    圖 2.UDI 開發的資料夾結構 圖 2。 UDI 開發的資料夾結構

    圖 2: UDI 開發的資料夾結構

確認 UDI 開發環境

設定UDI開發環境時,請確定範例專案在Visual Studio 2010 中正確建置,以確認UDI開發環境已正確設定。

判斷是否正確設定 UDI 開發環境:

確認 SamplePage 專案建置正確

SamplePage 專案提供如何為 UDI Wizard 建立自定義精靈頁面的範例。 如需SamplePage專案的詳細資訊,請參 閱檢閱SamplePage Visual Studio方案

確認 SamplePage 專案是否正確建置

  1. 啟動 Visual Studio 2010。

  2. 開啟 SamplePage 專案。

    SamplePage 項目位於 local_folder\SDK\UDI\SamplePage 資料夾 (,其中 local_folder 是您稍早在程式) 中建立的資料夾。

  3. 在 Visual Studio 2010 的 方案總管 中,以滑鼠右鍵按兩下 SamplePage 專案,然後選取 [屬性]

    [ SamplePage 屬性頁 ] 對話框隨即出現。

  4. 在 [ SamplePage 屬性頁 ] 對話框中,移至 [組態屬性/偵錯]。

  5. 在 [偵錯] 屬性的 [設定 ] 下,選取 [ 所有組態]

  6. 在 [偵錯] 屬性的 [ 命令] 底下,輸入 $ (TargetDir) \OSDSetupWizard.exe。

  7. 在 [偵錯屬性] 的 [ 工作目錄] 底下,輸入 $ (TargetDir)

  8. 在 [ SamplePage 屬性頁 ] 對話框中,移至 [組態屬性/建置事件/建置後事件]。

  9. 在 [建置後事件] 屬性的 [ 命令行] 下,輸入下列內容:

    copy /y "$(ProjectDir)..\..\..\..\OSDSetupWizard\x86\*.*" "$(TargetDir)"
    xcopy /y /i "$(ProjectDir)..\..\..\..\OSDSetupWizard\x86\en-us" "$(TargetDir)en-us"
    copy /y "$(ProjectDir)..\..\..\..\OSDSetupWizard\OSDResults\Images\UDI_Wizard_Banner.bmp" "$(ProjectDir)header.bmp"
    copy /y "$(ProjectDir)Config.xml" "$(TargetDir)"
    copy /y "$(ProjectDir)header.bmp" "$(TargetDir)header.bmp"
    
  10. 在 [ SamplePage 屬性頁 ] 對話框中,選取 [ 確定]

  11. 儲存專案。

  12. 從 [ 偵錯] 功能表中,選取 [ 開始偵錯]

    [ Microsoft Visual Studio] 對話框隨即出現,指出來源已過期,並詢問您是否要建置專案。

  13. 在 [ Microsoft Visual Studio ] 對話框中,選取 [ 是]

    [ 沒有偵錯資訊 ] 對話框隨即出現,通知您沒有偵錯資訊可供 OSDSetupWizard.exe 使用。

  14. 在 [ 沒有偵錯資訊 ] 對話框中,選取 [ 是]

    [UDI 精靈] 隨即開啟,並顯示自定義精靈頁面。

  15. 確認您可以在 [ 選擇您的位置] 中選取值。

  16. 具有範例頁面窗體的精靈中 ,選取 [ 取消]

    [ 取消精靈 ] 對話框隨即出現。

  17. 在 [ 取消精靈 ] 對話框中,選取 [ 是]

  18. 關閉 Visual Studio 2010。

確認 SampleEditor 專案建置正確

SampleEditor 專案提供如何為 UDI Wizard Designer 建立自定義精靈頁面編輯器的範例。 如需SampleEditor專案的詳細資訊,請參 閱檢閱SamplePage Visual Studio方案

確認 SampleEditor 專案是否正確建置

  1. 啟動 Visual Studio 2010。

  2. 開啟 SampleEditor 專案。

    SampleEditor 項目位於 local_folder\SDK\UDI\SampleEditor 資料夾 (,其中 local_folder 是您稍早在程式) 中建立的資料夾。

  3. 在 Visual Studio 2010 的 方案總管 中,選取 SampleEditor 專案。

  4. 從 [ 專案] 功能表中,選取 [ 新增參考]

    [ 加入參考] 對話框隨即開啟。

  5. 在 [ 新增參考] 對話框中,選取 [ 瀏覽] 索引標籤

  6. 在 [ 流覽] 索 引標籤上,移至 installation_folder\Bin (,其中 installation_folder 是您安裝 MDT) 的資料夾。 選取下列檔案,然後選取 [ 確定]

    • Microsoft.Enterprise.UDIDesigner.Common.dll

    • Microsoft.Enterprise.UDIDesigner.DataService.dll

    • Microsoft.Enterprise.UDIDesigner.Infrastructure.dll

    • Microsoft.Practices.Prism.dll

    • Microsoft.Practices.ServiceLocation.dll

    • Microsoft.Practices.Unity.dll

    • RibbonControlsLibrary.dll

    注意事項

    您可以在選取檔案時按住 CTRL 鍵,在 [ 瀏覽 ] 索引標籤上選取多個檔案。

  7. 在 方案總管 中,移至 SampleEditor/References。

  8. 確認沒有任何參考有任何警告或錯誤。

  9. 在 方案總管 中,以滑鼠右鍵按兩下SampleEditor專案,然後選取 [屬性]

    [ SampleEditor 屬性頁 ] 對話框隨即出現。

  10. 在 [ SampleEditor 屬性頁 ] 對話框中,選取 [ 偵錯] 索引 卷標。

  11. 在 [ 偵錯] 索引 標籤上,選取 [ 啟動外部程式]

  12. [啟動外部程式] 中,輸入 installation_folder\Bin\UDIDesigner.exe (其中 installation_folder 是您安裝 MDT) 的資料夾,然後選取 [ 確定]

    提示

    您可以選取省略號 (...) 按鈕瀏覽至資料夾,然後選取 [UDIDesigner.exe]。

  13. 從 [ 檔案] 功能表中,選取 [ 全部儲存]

  14. local_folder\SDK\SamplePage\SamplePage.dll.config 檔複製到 installation_folder\Bin\Config 資料夾 (,其中 local_folder 是您稍早在設定程式中於開發計算機上建立的資料夾,installation_folder 是您安裝 MDT) 的資料夾。

  15. 在 Visual Studio 2010 中,從 [ 偵錯] 功能表中,選取 [ 開始偵錯]

    UDI 精靈 Designer 啟動。

  16. 在 [UDI 精靈] Designer 的功能區上,選取 [開啟]

    [ 開啟 ] 對話框隨即出現。

  17. 在 [ 啟] 對話框中,開啟 local_folder\SDK\SamplePage\SamplePage\Config.xml 檔案 (,其中 local_folder 是您稍早在設定程式) 中於開發計算機上建立的資料夾。

    Config.xml 檔案隨即開啟,且 [自定義 階段] 群組 會顯示在詳細數據窗格中。

  18. 在詳細數據窗格中,選取 [ 設定] 索引標籤

  19. 檢閱 [ 位置] 方 塊的設定資訊,包括下列各項:

    • 已解除鎖定 的按鈕,可讓您啟用或停用 [位置] 方

    • 預設值 方塊,您會在其中輸入要在 [ 位置 ] 方塊中顯示的預設值

    • 易記的顯示名稱會顯示在摘要頁面中,您可以在其中輸入 [摘要] 頁面上所顯示資訊的 標題

    • 位置 清單框,其中包含可能的位置清單

  20. 關閉 UDI Wizard Designer。

  21. 關閉 Visual Studio 2010。

檢閱 UDI SDK 範例

開始開發之前,請檢閱UDI SDK 中提供的範例。 使用本指南中的資訊和範例中的原始碼,協助您建立自己的UDI自定義精靈頁面和精靈頁面編輯器。

檢閱下列專案,以流覽 UDI SDK 範例:

檢閱 SDK 資料夾的內容

在設定 UDI 開發環境期間,您已將 SDK 資料夾從您安裝 MDT 的資料夾複製到您建立的另一個資料夾。 表 1 列出 SDK 資料夾下方的資料夾,並提供每個資料夾的簡短描述。

表 1. UDI SDK 中的資料夾

Folder 此資料夾包含
包含 為UDI精靈建立自定義精靈頁面所需的 C++ 頭檔
Libs 將連結至自定義頁面的 C++ 連結庫檔案;靜態連結庫有32位和64位版本。 注意: IA-64) (連結庫的 Itanium 版本無法使用。
SampleEditor Visual Studio 專案,用於建置用來編輯 UDI Wizard Designer 中 SamplePage 頁面的自定義編輯器,以 C 撰寫#
SamplePage Visual Studio 專案,用於建置以 Visual C++ 撰寫的自定義 UDI 精靈頁面

檢閱 SamplePage Visual Studio 方案

開始建立自定義精靈頁面和精靈頁面編輯器之前,請執行下列工作來準備UDI開發環境:

檢閱精靈頁面生命週期

UDI 精靈頁面具有對應至頁面生命週期之每個階段 (或階段) 的方法。 在建立自定義精靈頁面時,您需要使用程式碼覆寫這些方法。 表 2 列出您需要覆寫的方法,並提供每個方法的簡短描述,包括在精靈頁面生命週期中使用 方法的時機。

表 2. 精靈頁面生命週期中的方法

方法 描述
OnWindowCreated 建立頁面的窗口之後,會呼叫這個方法一次。

針對這個方法,撰寫第一次初始化頁面的程序代碼,而且只需要執行一次。 例如,使用此方法來初始化欄位,或從 UDI Wizard 組態檔中的 Setter 元素讀取組態資訊。
OnWindowShown 每次在 UDI Wizard 中顯示頁面 () 時,都會呼叫這個方法。 第一次顯示頁面時,以及每次您在精靈中選取 [ 一步] 或 [ 返回 ] 瀏覽至頁面時,都會呼叫它。

針對這個方法,撰寫程式代碼來準備要顯示的頁面,例如讀取記憶體變數、工作順序變數或環境變數,然後根據這些變數的任何變更來更新頁面。
OnCommonControlEvent 每當精靈頁面顯示並接收來自子系 (的WM_NOTIFY訊息時,通常可以呼叫這個方法,也就是一般控件) 。

針對這個方法,撰寫會根據通知訊息處理WM_NOTIFY的程序代碼。 例如,您可能想要回應來自一般控件的事件,例如回應 TreeView 控件的選取或按兩下事件。
OnUnhandledEvent 每當精靈頁面發生未處理的視窗訊息時,就會呼叫這個方法。 這個方法提供攔截和處理這些未處理之視窗訊息的機會。

針對這個方法,撰寫程式代碼來處理與精靈頁面相關的視窗訊息。 一般而言,您不需要覆寫這個方法。
OnNextSelected 當您在精靈中選取 [ 下一步 ] 時,會呼叫這個方法。

針對這個方法,請撰寫程序代碼,在移至下一個精靈頁面之前執行任何必要的動作,例如,執行可能需要很長一段時間的驗證。 如果驗證失敗,您可以取消 下一個 要求並顯示訊息。
OnWindowHidden 每次顯示上一個或下一個精靈頁面時,都會隱藏頁面時呼叫這個方法。

針對這個方法,在顯示另一個頁面之前,撰寫在隱藏頁面之前執行任何動作的程序代碼。 一般而言,您不需要覆寫這個方法。

檢閱SamplePage範例

使用下列清單檢閱 SamplePage 範例,該清單代表 SamplePage 範例的精靈頁面生命週期期間的事件順序:

  1. UDI Wizard OSDSetupWizard.exe 會從範例中的 UDI Wizard 組態檔讀取組態資訊, (Config.xml 檔案) ,如 步驟 1:UDI Wizard (OSDSetupWizard.exe) 讀取 Config.xml 檔案中所述。

  2. UDI Wizard 會載入 UDI Wizard 組態檔中所列之每個精靈頁面所需的 DLL,如步驟 2:UDI 精靈載入自定義精靈頁面的 DLL 中所述。

  3. UDI 精靈會顯示自定義精靈頁面,並允許所需的控件互動,如 步驟 3:UDI 精靈顯示自定義精靈頁面中所述。

  4. 當自定義精靈頁面已收集資訊時,請先執行任何必要的工作,再選取 [下一步 ] 繼續進行下一個精靈,如 步驟 4:[自定義精靈] 頁面中選取的 [下一個按鈕] 中所述。

步驟 1:UDI 精靈 (OSDSetupWizard.exe) 讀取 Config.xml 檔案

當UDI Wizard (OSDSetupWizard.exe) 啟動時,預設會讀取UDI Wizard組態檔,也就是 UDIWizard_Config.xml 檔案,也就是UDI Wizard的主要組態檔。

注意事項

此範例會使用 Config.xml 檔案作為組態檔。 在 MDT 中,預設組態檔是 UDIWizard_Config.xml 檔案,位於 MDT Files 套件中用於設定的 Scripts 資料夾中。

您可以將 UDI Wizard 工作順序步驟修改為使用 /definition 參數,以覆寫 UDI Wizard 所使用的預設組態檔。 For more information about overriding the default configuration file that the UDI Wizard uses, see "Override the Configuration File That the UDI Wizard Uses".

Config.xml 檔案中的最上層元素是

  • DLL 專案

  • Style 元素

  • Pages 元素

  • StageGroups 元素

    如需 UDI Wizard 組態檔的架構和每個元素的詳細資訊,請參閱 UDI Wizard 組態檔架構參考

    UDI 精靈會掃描 DLL 元素,尋找要載入的 .dll 檔案。 在此範例中,會列出兩個 .dll 檔案:SamplePage.dll 和 SharedPages.dll。 這些 .dll 檔案必須位於與 OSDSetupWizard.exe 相同的資料夾中,也就是 Tools\platform 資料夾 (其中,32 位版本的 platform 為 x86,而 64 位版本) 為 x64。

    UDI 精靈會掃描 Pages 元素,尋找已定義的頁面。 在此範例中,定義了兩個頁面: CustomSummaryPagePage 元素的 Type 屬性定義於 PageClassIDs.h 檔案中,並唯一定義自定義頁面的類型。

    在此範例中,定義的類型是 Microsoft.SamplePage.LocationPage。 針對您的自定義頁面,請使用下列專案來避免與您未來可能會建立的其他頁面發生衝突:

  • 您的組織名稱取代 Microsoft

  • 您的項目名稱會取代 SamplePage

  • 您的自定義精靈頁面名稱會取代 LocationPage

步驟 2:UDI 精靈載入自定義精靈頁面的 DLL

當UDI精靈載入您的 DLL 時,它會呼叫 RegisterFactories 函式,此函式必須在您的 .dll 檔案中實作。 在此範例中,此函式會在 dllmain.ccp 檔案中實作。 您建立的每個精靈頁面都必須實作 RegisterFactories 函式

RegisterFactories 函式可用來向 UDI Wizard 的 Class Factory 登錄註冊精靈頁面的 Factory 類別。 類別處理站 是可以建立另一個類別實例的類別。 RegisterFactories 函式會建立 Factory 類別的新實例,並將該類別傳遞至 UDI Wizard 的 Class Factory 登錄,讓精靈可以使用該 Factory 類別。 UDI 精靈會尋找以標識符註冊的 Factory 類別,該標識元符合自定義精靈頁面之 Page 元素的 Type 屬性。

在此範例中,標識碼在PageClassIds.h檔案中定義為 ID_LocationMicrosoft.SamplePage.LocationPage,這符合 Config.xml 檔案中 Page 元素的 Type 屬性。 ID_Location 會在 dllmain.ccp 檔案中實作的 RegisterFactories 函式中當作參數傳遞。

您可以使用 Register_name 函式範本來建立函式,以簡化新處理站實例的建立,並註冊新建立的實例。 使用 Register 函式範本提供的 名稱 值必須實作 iClassFactory 介面。 ClassFactoryImpl 類別會處理大部分實作 Class Factory 的詳細數據。

您也可以使用 RegisterFactories 函式來註冊工作類型和驗證程式類型。 如需詳細資訊,請參閱下列各主題:

注意事項

此範例只包含並註冊一個自定義精靈頁面。 此範例不包含自定義工作或驗證程式,因此不會註冊任何自定義工作或驗證程式。

步驟 3:UDI 精靈顯示自定義精靈頁面

範例中的自定義精靈頁面定義於 LocationPage.cpp 檔案中。 精靈頁面衍生自範本類別,可提供頁面擁有的大部分功能。 所有精靈頁面都應該衍生自 WizardPageImpl 樣本類別,該類別會實作 IWizardPage介面。 每個精靈頁面都可以根據頁面的需求,實作其他選擇性範本類別和對應的介面。

WizardPageImpl 範本類別有數個實用的介面,可協助您撰寫自定義精靈頁面。 實作 WizardPageImpl 樣本類別 作為自定義精靈頁面的基類。

如需可用的清單:

  • 精靈頁面的範本類別,請參閱 精靈頁面協助程序類別

  • 精靈頁面範本類別的介面,請參閱 精靈頁面介面

    範例中的自定義精靈頁面衍生自 WizardPageImpl 樣本類別 ,並實作 IWizardPage介面。 此外,自定義精靈頁面會實作 IFieldCallback 介面。 這兩個都會在 LocationPage.cpp 檔案中實作。

    範例自定義精靈頁面會覆寫下列方法:

  • OnWindowCreated。 範例精靈頁面中的 OnWindowCreated 方法會呼叫下列方法:

    • AddField。 這個方法會將IDD_LOCATION_PAGE資源中的IDC_COMBO_LOCATION方塊控件與 Config.xml 檔案中名為Location的Data元素產生關聯。

      除了 AddField 方法之外,您還可以使用 AddRadioGroupAddToGroup 方法來支援其他控件和行為。

      注意事項

      在呼叫 InitFields 方法之前,請確定您呼叫 AddFieldAddRadioGroupAddToGroup 方法。

    • InitFields。 使用這個方法來初始化您已新增至窗體) 控件 (字段。 頁面的指標是參數。 在此範例中, 會傳遞這個 指標,其會參考目前的頁面。

      注意事項

      若要支援使用指標,除了WizardPageImpl 樣本類別支援的介面之外,您還必須實作IFieldCallback介面。

      IFieldCallback 介面會呼叫 SetFieldDefault 方法,用來設定文本框和複選框控件以外的控件預設值。 在此範例中,SetFieldDefault 方法會根據 Config.xml 檔中 Field 元素的 Default 元素中指定的預設值,設定下拉式方塊控件的初始索引。

      OnWindowCreated 方法會使用 IFormController 介面來設定表單控制器。 如需設定表單控制器的詳細資訊,請參閱 設定表單

  • InitLocations。 這個方法會從 Config.xml 檔案中的位置清單填入下拉式方塊。 Confg.xml 檔案的 Data 元素和子 DataItem 元素會提供可能值的清單。

  • OnNextSelected。 這個方法會執行下列工作:

    • 匯報 TSLocation 工作順序變數,並使用 SaveFields 方法在下拉式方塊中選取值

    • 新增將使用 SaveFields 方法顯示在 [摘要] 頁面上的資訊

步驟 4:在自定義精靈頁面中選取下一個按鈕

當使用者完成自定義精靈頁面上的欄位時,他們會選取 [下一步],這會呼叫 OnNextSelected 方法。 OnNextSelected 方法會先執行任何必要的工作,再繼續進行下一個精靈頁面,例如記錄在自定義精靈頁面上所做的任何設定變更。

針對範例自定義精靈頁面, OnNextSelected 方法的覆寫會在LocationPage.ccp檔案中實作。 在範例自定義精靈頁面的 OnNextSelected 方法中,會呼叫下列方法:

  1. InitSection。 這個方法會針對 [要] 頁面上顯示的摘要數據,初始化標頭 (標籤 標題) 。 一般而言,您可以使用 DisplayName () 函式來設定此值。 與此 標題 相關聯的數據會使用 SaveFields 方法儲存。

  2. SaveFields。 這個方法會將域值儲存至工作順序變數,以及儲存至 [ 摘要 ] 頁面上顯示的數據。

檢閱 SampleEditor Visual Studio 解決方案

開始建立您自己的自定義精靈頁面和精靈頁面編輯器之前,請執行下列步驟來準備 UDI 開發環境:

檢閱 UDI Wizard Designer 架構

UDI Wizard Designer 是使用 WPF、Prism 和 Unity 所開發。 UDI Designer 可用來編輯 UDI Wizard 組態檔 (UDIWizard_Config.xml) ,UDI Wizard (OSDSetupWizard.exe) 在運行時間讀取該檔案。 UDI Wizard 組態檔中的 Pages 元素包含一份頁面清單,其中每個精靈 頁面 都有個別的 Page 元素。

當您編輯精靈頁面的組態設定時,UDI Wizard Designer 載入對應至精靈頁面類型的自定義頁面編輯器。 自定義精靈頁面編輯器會開發為 WPF 使用者控制件。 自定義精靈頁面編輯器頁面使用 Model-View-ViewModel (WPF的MVVM) 設計模式。

MVVM 設計模式有助於區隔使用者介面 (UI;簡報) 來自所呈現的數據。 數據是 UDI Wizard 組態檔中 Page 元素的外觀, (範例) 中的 Config.xml 檔案,使用 IDataService 介面的 CurrentPage 屬性來存取。

UDI Wizard Designer 會使用 DependencyAttribute,根據 Unity 中的相依性插入架構來取得 DataService 類別的存取權。 如需 Unity 中相依性插入架構的詳細資訊,請參閱 在您的應用程式中插入一些生命 — 瞭解 Unity 應用程式區塊

檢閱 UDI 精靈頁面的可設定元件

當您建立自定義精靈頁面時,某些組態設定可能會在程式代碼中設定,而且在您編譯頁面之後無法變更。 不過,對於其他組態設定,您必須允許使用 UDI Wizard Designer 來變更這些組態設定。

一般而言,您想要使用UDI Wizard Designer 設定的組態設定會儲存在UDI Wizard組態檔中, (範例) 中的 Config.xml 檔案。 不過,如有必要,您也可以建立自己的個別組態檔。 使用個別組態檔的其中一個範例是 UDIWizard_Config.xml.app 檔案,應用程式 探索 工作和 ApplicationPage 精靈頁面類型會使用此檔案。

以下是您可以使用 UDI Wizard Designer 管理的一般組態設定清單:

  • 欄位。 使用欄位可讓使用者提供輸入。 欄位會在 UDI Wizard 設定檔 (UDIWizard_Config.xml) 中顯示為 Field 元素,其中包含每個字段的組態設定。 對應的精靈頁面編輯器必須提供方法,以使用 FieldElementControl 編輯欄位的欄位組態設定。

  • 屬性。 Setter 可協助建立頁面上實體的屬性,例如 Page 元素中的頁面、Field元素中的 欄位 ,或 DataDataItem 元素中的數據。 您可以在 Setter 元素中設定屬性。 為您想要定義的每個屬性新增個別 的 Setter 元素。 您可以使用 SetterControl 編輯屬性,並使用其他控制項設定其他 Setter 元素。

  • 資料。 數據是用來儲存資訊,供精靈頁面和其他元件使用。 您可以使用 Data 或 DataItem 元素來定義頁面或欄位的數據。 數據可以透過適當地使用 Data 或 DataItem 元素,在平面或階層式結構中定義。 SDK 範例中的 Config.xml 會示範如何建置平面數據結構。

    您建立的自定義精靈頁面編輯器必須能夠管理這些組態設定。

檢閱EditorPage範例

EditorPage 範例可用來設定 UDI Wizard 組態檔中 SamplePage 精靈頁面的組態設定。 EditorPage 範例具有下列主要元件:

  • 設定 位置 下拉式方塊設定的UI

  • 在可能的位置清單中新增或編輯位置的UI,這些位置會顯示在 [ 位置 ] 下拉式方塊中

  • 讀取並儲存至 UDI Wizard 組態檔的組態設定

  • 支援其他元件的程序代碼

    執行下列步驟來檢閱 Visual Studio 中的 EditorPage 範例:

  1. 如檢閱精靈頁面編輯器載入和初始化中所述,檢閱如何在 UDI Wizard Designer 中載入和初始化 SampleEditor 精靈頁面編輯器。

  2. 檢閱用來編輯 LocationPageEditor.xaml 中 [ 位置 ] 下拉式方塊的 UI,並LocationPageEditor.xaml.cs檔案,如 檢閱用來設定位置下拉式方塊的使用者介面中所述。

  3. 檢閱用來在 AddEditLocationView.xaml 清單中新增或編輯位置的 UI,並AddEditLocationView.xaml.cs檔案,如 檢閱用來修改可能位置清單的使用者介面中所述。

  4. 檢閱用來管理儲存在 UDI Wizard 組態檔中之組態資訊的程式代碼,如 檢閱用來管理組態資訊的程式代碼中所述。

檢閱精靈頁面編輯器載入和初始化

UDI Wizard Designer 會視需要載入自定義精靈頁面編輯器。 UDI Wizard Designer 組態檔會在 UDI Wizard Designer 啟動時載入。 UDI 精靈 Designer 會掃描 install_folder\Bin\Config 資料夾 (,其中 install_folder 是 MDT 安裝所在的文件夾名稱,) 具有 .config 擴展名的檔案。

在設定 UDI 開發環境期間,您已將 SamplePage.dll.confg 檔案複製到 install_folder\Bin\Config 資料夾。 當您啟動 UDI Wizard Designer 時,會找到並載入 SamplePage.dll.confg 檔案。

UDI Wizard Designer 會使用 SamplePage.dll.confg 檔案中 Page 元素的下列屬性來載入並初始化 EditorPage 範例:

  • DesignerAssembly。 這個屬性會決定要載入的 DLL 名稱。 此 DLL 必須放在與 UDIDesigner.exe 檔案相同的資料夾中,也就是 install_folder\Bin 資料夾 (,其中 install_folder 是安裝 MDT 的名稱資料夾) 。

  • DesignerType。 這個屬性是包含 WPF 使用者控制項之類別的 Microsoft .NET 類型名稱。

  • 類型。 使用此屬性來設定UDI Wizard 載入之自定義精靈頁面的頁面類型。 UDI Wizard Designer 使用這個屬性,在 UDI Wizard 組態檔中找出適當的 Page 元素。

  • Dll。 使用此屬性可在 UDI Wizard 組態檔中設定 DLL 元素,UDI Wizard Designer 建立此檔案。

  • 描述。 使用此屬性來提供精靈頁面編輯器的相關信息。 這個屬性的值會顯示在 UDI Wizard Designer 的 [新增頁面] 對話框中,用來將精靈頁面新增至 「頁面庫」。

  • DisplayName。 使用此屬性來提供UDI Wizard Designer 中顯示的自定義精靈頁面名稱。 這個屬性的值會顯示在 UDI Wizard Designer 的 [新增頁面] 對話框中,用來將精靈頁面新增至 「頁面庫」。

    在此範例中, SamplePage 自定義精靈頁面的類型是 Microsoft.SamplePage.LocationPage,它會儲存在 Config.xml 檔案中。 Config.xml 檔案位於 local_folder\SDK\SamplePage\SamplePage 資料夾中, (其中 local_folder 是您稍早在設定程式) 中於開發計算機上建立的資料夾。

檢閱用來設定位置下拉式方塊的用戶介面

載入並初始化精靈頁面編輯器時,會在編輯類型為 Microsoft.SamplePage.LocationPage 的頁面時載入 SampleEditor 精靈頁面編輯器。 頁面編輯器的 UI 會儲存在 LocationPageEditor.xaml 檔案中。

如果您檢查 [ 設計 ] 索引標籤標上的 UI 和 [XAML] 索 引標籤上的程式代碼,您可以在 [可延伸的應用程式標記語言] (XAML) 中看到圖形化 UI 與元素和屬性之間的關聯性。

例如,如果您檢閱 XAML 中的 Controls:FieldElementControl 元素,您可以查看與對應 UI 配置的關聯性。 使用 Controls:FieldElementControl 元素來定義 FieldElementControl 控制件。

XAML 檔案中的 Binding 參數會將範例頁面編輯器上的欄位與 UDI 精靈組態檔中的資訊係結。 例如,下列程式代碼會將 [預設值] 文本框與範例中 UDI 精靈配置檔 (Config.xml 中的 Default 元素系結) :

<TextBox Text="{Binding FieldData.DefaultValue,
 UpdateSourceTrigger=PropertyChanged,
 Mode=TwoWay}"/>

如需詳細資訊,請 參閱 How to: Make Data available for Binding in XAML

使用 XAML 中的 Views:CollectionTControl.ColumnCollectionView 元素來編輯方格檢視中可用位置的清單。 您可以使用 CollectionTControl 控件來顯示網格線檢視,並將網格線檢視系結至 UDI 組態檔中名稱為 Location的 Data 元素。

檢閱用來修改可能位置清單的使用者介面

變更可能位置清單的 UI 包含:

檢閱內容相關功能表和功能區按鈕以修改位置清單

當您在包含位置清單的清單框中單擊滑鼠右鍵時,會顯示上下文相關功能表。 功能區具有對應的按鈕,可讓您執行相同的工作。 LocationPageEditor.xaml 檔案中的 Views:CollectionsTControl 控件元素會根據所採取的動作和您設定的屬性來定義呼叫的方法,如下所示:

  • SelectedItem。 當使用者從清單中選取專案時,就會啟動此數據系結屬性。 這個屬性會系結至檢視模型中的 CurrentLocation 屬性,此屬性位於LocationPageEditorViewModel.cs檔案中,而且 由 CollectionTControl 控件用來傳遞編輯或移除現有項目時選取的專案。

  • AddItemAction。 當使用者從內容敏感功能表或功能區上的對應按鈕中選取 [ 新增專案 ] 選項時,就會執行此動作。 檢視模型中傳回 AddLocationAction 對象的屬性有數據系結。 這個對像是位於 LocationPageEditorViewModel.cs 檔案中的 AddLocationCallback 方法,並且會在 AddEditLocationView.xaml 檔案中顯示對話方塊。

  • EditItemAction。 當使用者從上下文相關功能表中選取 [ 編輯專案 ] 選項時,就會執行此動作。 在檢視模型中,有一個屬性的數據系結會傳回 EditLocationAction 物件。 這個對像是位於 LocationPageEditorViewModel.cs 檔案中的 EditLocationCallback 方法,並且會在AddEditLocationView.xaml檔案中顯示對話框。

  • RemoveAction。 當使用者從上下文相關功能表中選取 [ 移除專案 ] 選項時,就會執行此動作。 檢視模型中傳回 RemoveAction 物件的屬性有數據系結。 此對像是位於 LocationPageEditorViewModel.cs 檔案中的 EditLocationCallback 方法,並顯示確認刪除位置的訊息。

檢閱新增或編輯位置的對話框

如果您將新位置新增至位置清單或編輯現有位置,則會顯示 AddEditLocationView.xaml 檔案中的訊息。 訊息會使用 LocationPageEditorViewModel.cs 檔案中的 ShowDialogWindow 視窗方法來顯示。

AddEditLocationView.xaml 檔案中的 UI 包含:

  • 名為 DialogFrame 的對話方塊,其中包含下列元素:

    • 您使用對話框的 DialogTitle 屬性設定的標題

    • [確定] 按鈕,會將Approved屬性的傳回狀態設定為 True (傳回狀態會在LocationPageEditorViewModel.cs檔案的 AddLocationCallback 方法中核取,以判斷使用者是否選取 [確定]。)

    • [取消] 按鈕,會將Approved屬性的傳回狀態設定為 False (會在 LocationPageEditorViewModel.cs 檔案的 AddLocationCallback 方法中檢查傳回狀態,以判斷使用者是否選取 Cancel.)

  • 包含下列專案的 WPF 專案:

    • 您使用 Content 屬性設定的標籤

    • 文本框,其系結至 UDI 組態檔中名稱為 Location 的 Data 元素, (範例中的 Config.xml 檔案)

檢閱用來管理組態資訊的程序代碼

自定義精靈頁面的組態資訊會儲存在 UDI Wizard 組態檔中,也就是:

  • Config.xml 範例中 UDI SDK 所提供的檔案 (此檔案只包含 example.)

  • UDIWizard_Config.xml MDT 提供的檔案,儲存在 installation_folder\Templates\Distribution\Scripts 資料夾 (,其中 installation_folder 是您安裝 MDT) 的資料夾;此檔案包含所有內建精靈頁面和階段的組態設定

    在 SampleEditor 範例中, Locations 例程可協助管理組態資訊,並位於LocationPageEditorViewModel.cs檔案中。 Locations 例程會從 UDI Wizard 組態檔傳回位置清單。 具體而言,傳回的清單包含UDI Wizard組態檔中每個 DataItem 元素的專案。

建立自定義UDI精靈頁面

建立自訂 UDI 精靈頁面的高階程式如下所示:

  1. 建立 SamplePage 解決方案的複本作為起點。

  2. 將所需的控件 (窗體上) 欄位。

  3. 撰寫程序代碼,以在精靈頁面載入 OnWindowCreated 方法) 的 (覆寫時執行適當的工作,包括下列步驟:

    1. 初始化表單。

    2. 讀取記憶體變數、工作順序變數、環境變數或 XML 檔案資訊 (例如 Setter 屬性) 。

  4. 撰寫任何程序代碼,以在顯示頁面時執行適當的工作 (覆寫 OnWindowShown 方法) ,包括下列步驟:

    1. 根據步驟 3 中載入頁面時所讀取的資訊,啟用或停用控件。

    2. 根據在步驟 3 中載入頁面時所讀取的資訊更新控制件,例如根據讀取的資訊來擴展控制件。

  5. 撰寫任何程式代碼,以在使用者與精靈頁面互動時執行適當的工作。

  6. 當使用者在 UDI 精靈中選取 [下一 ] (覆寫 OnNextSelected 方法) 時,撰寫任何程式代碼以執行適當的工作,包括下列步驟:

    1. 更新任何記憶體變數、工作順序變數、環境變數或 XML 檔案資訊。

    2. 如果頁面上的欄位未執行摘要頁面資訊, () 更新摘要頁面資訊。

  7. 建置解決方案。

    請確定您建立的 DLL 版本與 MDT 的安裝相同,特別是 Windows 預安裝環境的處理器平臺 (Windows PE) 。 UDI 精靈可以在下列項目中執行:

    • 目標計算機上現有的作業系統。 您可以在 32 位或 64 位 Windows 作業系統上執行 32 位版本的精靈頁面。 不過,您只能在 64 位 Windows 作業系統上執行 64 位版本的精靈頁面。

    • 目標電腦上的 Windows PE。 Windows PE 不支援在 64 位版本的 Windows PE 上執行 32 位應用程式。 因此,您必須為您打算使用的每個 Windows PE 處理器架構,建置精靈頁面的版本。

  8. 將自定義精靈頁面的 DLL 複製到 installation_folder\Templates\Distribution\Tools\ platform 資料夾 (其中 installation_folder 是您安裝 MDT 的資料夾,而 32 位版本的 平臺x86 ,或 x64 適用於 64 位版本) 。

  9. 完成建立自定義頁面編輯器的步驟。

建立自定義精靈頁面編輯器

建立自訂 UDI 精靈頁面編輯器的高階程式如下:

  1. 建立 SampleEditor 解決方案的複本作為起點。

  2. 在 .xaml 檔案中建立主頁面編輯器 UI。

  3. 新增精靈頁面所需的 FieldElementControl 控件實例,以在必要時 () 。

  4. 新增精靈頁面所需的 SetterControl 控件實例,以在必要時 () 設定。

  5. 視需要新增精靈頁面所需的 CollectionTControl 控件實例, (視需要設定) 。

  6. 新增 IDataService 介面。

  7. 撰寫適當的程式代碼,根據要使用自定義精靈頁面編輯器設定的組態設定來更新UDI Wizard組態檔。

  8. 在 .xaml 檔案中建立子對話框,並使用要設定的精靈頁面所需的 IMessageBoxService 介面,從主頁面編輯器呼叫它們。

  9. 根據要設定的精靈頁面需求,將適當的介面新增至 [UDI Wizard Designer 功能區]。

  10. 建置解決方案。

    注意事項

    請確定您建立的 DLL 版本與 MDT 安裝的處理器平臺相同。 例如,如果您安裝 64 位版本的 MDT,請建置 64 位版本的自定義頁面編輯器。

  11. 建立UDI Wizard Designer組態檔以載入必要的 DLL,並將精靈頁面編輯器與對應的精靈頁面對應 (範例) 中的 SamplePage.dll.config 檔案。

    如需在精靈頁面與精靈頁面編輯器之間執行對應所需元素的詳細資訊,請參閱 DesignerMappings 元素、子元素和對應的屬性。

  12. 將您在上一個步驟中建立的 UDI Wizard Designer 組態檔複製到 installation_folder\Bin\Config 資料夾 (,其中 installation_folder 是您安裝 MDT 版本) 的資料夾。

  13. 將自定義精靈頁面編輯器的 DLL 複製到 installation_folder\Bin 資料夾 (,其中 installation_folder 是您安裝 MDT) 的資料夾。

建立自定義 UDI 工作

UDI 工作 是以 C++ 撰寫的 DLL,可實作 ITask 介面。 您可以向 UDI Wizard Designer 工作連結庫註冊 DLL,方法是建立 UDI Wizard Designer 組態檔 (.config 檔案) ,並將它放在 installation_folder\Bin\Config 資料夾 (,其中 installation_folder 是您安裝 MDT) 的資料夾。

注意事項

您可以建立 DLL,其中包含相同 .dll 檔案內的精靈頁面、工作和驗證程式。 您也可以建立單一 UDI Wizard Designer 組態檔 (.config) ,其中包含 DLL 中精靈頁面、工作和驗證程式的組態設定。

建立自定義 UDI 工作

  1. 撰寫實作 ITask 介面 和下列方法的程式代碼:

    • Init。 系統會呼叫這個方法來初始化您的工作。

    • 執行。 系統會呼叫這個方法來執行您的工作。

  2. 撰寫程式代碼,向 Factory 登錄註冊自定義工作類別處理站。

  3. 建置自定義工作的解決方案。

    注意事項

    請確定您建立的 DLL 版本與 MDT 安裝的處理器平臺相同。 例如,如果您安裝 64 位版本的 MDT,請建置 64 位版本的自定義 UDI 工作。

  4. 在 UDI Wizard 中的 TaskLibrary 元素下建立 Task 元素 Designer 組態檔,如下列摘錄所示:

    <Task DLL="OSDRefreshWizard.dll" Description="Discovers supported applications for install." Type="Microsoft.OSDRefresh.AppDiscoveryTask" Name="Application Discovery">
       <TaskItem Type="Setter" Name="Status Bitmap">
          <Param Name="BitmapFilename"/>
       </TaskItem>
       <TaskItem Type="Setter" Name="Log File">
          <Param Name="log"/>
       </TaskItem>
       <TaskItem Type="Setter" Name="Write Configuration File">
          <Param Name="writecfg"/>
       </TaskItem>
       <TaskItem Type="Setter" Name="Read Configuration File">
          <Param Name="readcfg"/>
       </TaskItem>
    </Task>
    

    注意事項

    所有 Task 元素都應該包含 BitmapFilename 參數。 指定工作所需的所有其他參數。 例如,在先前的摘錄中,會使用 log 參數來指定記錄檔位置的參數。

  5. 將上一個步驟中建立的 UDI Wizard Designer 組態檔複製到 installation_folder\Bin\Config 資料夾 (,其中 installation_folder 是您安裝 MDT) 的資料夾。

  6. 將自定義工作的 DLL 複製到 installation_folder\Templates\Distribution\Tools\ platform 資料夾 (其中 installation_folder 是您安裝 MDT 的資料夾,而 平臺 是 32 位版本的 x86 ,或 x64 適用於 64 位版本) 。

建立自定義 UDI 驗證程式

UDI 驗證程式 是以 C++ 撰寫的 DLL,可實作 IValidator 介面。 您可以向 UDI Wizard Designer 驗證程式連結庫註冊 DLL,方法是建立 UDI Wizard Designer 設定檔 (.config 檔案) ,並將它放在 installation_folder\Bin\Config 資料夾 (,其中 installation_folder 是您安裝 MDT) 的資料夾。

建立自定義 UDI 驗證程式

  1. 撰寫程式代碼以建立 BaseValidator 類別的子類別,並實作下列方法:

    • Init (IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties) . 表單控制器會呼叫 Init 成員來初始化驗證程式。 這個方法必須呼叫BaseValidator類別的Init方法。 它通常會從 UDI Wizard 組態檔讀取為驗證程式設定的任何屬性。 例如, InvalidCharactersValidator 驗證程式 會使用這個方法擷取 InvalidChars 屬性的 值。

    • IsValid。 表單控制器會呼叫這個方法,以查看控制項是否包含有效的文字。 以下是驗證程式的 IsValid 方法範例,驗證欄位不是空的:

      BOOL IsValid(LPBSTR pMessage)
      {
          __super::IsValid(pMessage);
      
          _bstr_t text;
          m_pText->GetText(text.GetAddress());
          return (text.length() > 0);
      }
      
    • Init (IControl *pControl,LPCTSTR 訊息) 。 表單控制器會針對每個按鍵和其他事件呼叫此成員,讓驗證程式可以驗證精靈頁面底部的控件和更新的訊息內容, (或清除) 。

      一般而言,這些是您唯一需要覆寫的方法。 不過,視驗證程式而定,您可能需要覆寫您所建立 BaseValidator 類別子類別中的其他方法。 如需這些其他方法的詳細資訊,請參閱 BaseValidator 類別。

  2. 撰寫可向登錄處理站註冊自定義工作類別的程序代碼。

  3. 建置自定義工作的解決方案。

    注意事項

    請確定您建立的 DLL 版本與 MDT 安裝的處理器平臺相同。 例如,如果您安裝 64 位版本的 MDT,請建置 64 位版本的自定義 UDI 工作。

  4. 在 UDI Wizard 中的 ValidatorLibrary 元素下建立 Validator 元素 Designer 組態檔,如下列摘錄所示:

    <Validator
    <Validator DLL="" Description="Must follow a pre-defined pattern" Type="Microsoft.Wizard.Validation.RegEx" Name="NamedPattern">
       <Param Description="Enter the message you want displayed when the text in this field doesn't match the pattern:" Name="Message" DisplayName="Message"/>
       <Param Description="The name of a pre-defined regular expression pattern. Must be Username, ComputerName, or Workgroup" Name="NamedPattern" DisplayName="Named Pattern"/>
    </Validator>
    

    警告

    所有 Validator 元素都應該包含 Message 參數。 指定驗證程式所需的所有其他參數。 例如,在先前的摘錄中, NamedPattern 參數是用來指定預先定義正則表示式模式名稱的參數。

  5. 將上一個步驟中建立的 UDI Wizard Designer 組態檔複製到 installation_folder\Bin\Config 資料夾 (,其中 installation_folder 是您安裝 MDT) 的資料夾。

  6. 將自定義工作的 DLL 複製到 installation_folder\Templates\Distribution\Tools\ platform 資料夾 (其中 installation_folder 是您安裝 MDT 的資料夾,而 平臺 是 32 位版本的 x86 ,或 x64 適用於 64 位版本) 。

UDI 精靈參考

精靈頁面元件

您可以使用數個預建元件中的任何一個來建置自定義頁面。

建立元件實例

UDI 精靈會使用類別處理站為您建立物件的新實例。 這些處理站會使用字串作為處理站的密鑰,向處理站登錄註冊。 例如, WmiRepository 元件是由字串 「Microsoft.Wizard.WmiRepository」 識別,其可在 IWmiRepository 頭文件中作為 ID_WmiRepository

假設您已將頁面撰寫為 WizardPageImpl 的子類別,您可以建立 WmiRepoistory 的新實 例,如下所示:

PWmiRepository pWmi;
CreateInstance(Container(), ID_WmiRepository, &pWmi);

CreateInstance 函式是一種型別安全的範本函式,可建立元件的新實例。 PWmiRepository 是智慧型手機指標,因此它會為您處理參考計數。

可建立的元件

您可以向登錄註冊一元件。 第一元件一律會註冊,因為主要的 UDI Wizard 可執行檔會提供它。 另外兩元件則以「選擇性」DLL 提供。 若要讓這些元件可供使用,DLL 必須列在 .config XML 檔案的 [DLL ] 區段中。 您的程式代碼不需要知道哪個可執行檔包含特定元件。

元件名稱 (元件的元件標識碼清單與標識符相同,但沒有初始 ID_) 向 OSDSetupWizard) 中定義的處理站登錄 (註冊,則會顯示在表 3 中。

表格 3 元件識別碼

識別碼 描述
ID_ACPowerTask (ITask、IWizardComponent) 預檢工作,可確保您的電腦不會單獨使用電池執行
ID_AppDiscoveryTask (ITask、IWizardComponent) 用來探索電腦上已安裝哪些軟體專案的特製化工作
ID_BackgroundTask (IBackgroundTaskIWizardComponent) 可用來在另一個線程上執行工作
ID_CopyFilesTask (ITaskIWizardComponent) 複製一或多個檔案的工作
ID_FormController (IFormController) 當您的頁面收到自己的實例時,您最不需要自行建立實例
ID_InvalidCharactersValidator (IValidator) 確定沒有文字欄位包含提供給驗證程式之清單中的字元
ID_Logger (ILogger) 您最不想自行建立實例,因為您的頁面會收到共享實例的指標
ID_NonEmptyValidator (IValidator) 可確保沒有字段空白的驗證程式
ID_PasswordValidator (IValidator) 驗證程式,可確保沒有兩個文字欄位具有相同的內容
ID_Regex (IRegEx) 評估正規表示式,尋找相符專案
ID_RegExValidator (IValidator) 針對正則表示式或已知模式進行驗證的驗證程式
ID_SimpleStringProperties (IStringProperties,ISimpleStringProperties) 提供簡單的方法將屬性傳送至工作,而不使用 XML
ID_ShellExecuteTask (ITaskIWizardComponent) 執行外部程式
ID_SummaryBag (ISummaryBag) 透過 Form 方法從您的頁面間接提供
ID_TaskManager (ITaskManagerIBackgroundCallbackIWizardComponent) 管理執行一組工作和 UI
ID_WmiRepository (IWmiRepository,IWizardComponent) 可讓您執行 Windows Management Instrumentation (WMI) 查詢
ID_IXmlDocument (IXmlDocument) 提供讀取和寫入 XML 檔的外觀

定義的 OSDRefreshWizard.dll、共用頁面和其他控件元件會顯示在表 4 和表格 5 中。

表格 4 目錄控制件

識別碼 描述
ID_Directory (IDirectory) 從文件系統取得目錄信息的外觀

表格 5 已定義 SharedPages.dll

識別碼 描述
ID_ADHelper (IADHelper) 為 Active Directory® Domain Services (AD DS) 中一組有限的功能提供外觀
ID_CpuInfo (ICpuInfo) 判斷您的 CPU 是 32 還是 64 位
ID_DomainJoinValidator (IDomainJoinValidator) 有一些方法可檢查是否允許一組認證加入網域
ID_DriveList (IDriveListIBindableListIWizardComponent) 使用 WMI 取得電腦上的磁碟驅動器清單
ID_WiredNetworkTask (ITask) 檢查您是否使用硬式連線 (連線到網路的工作,而不是無線) 網路適配器

控件元件

您可以透過 GetControlWrapper 範本函式與頁面上的控件互動,該函式可讓您存取表格 6 中列出的其中一種元件類型。

表格 6 元件

對話框控制件類型 描述
CONTROL_CHECK_BOX (ICheckBox) 使用複選框控件的外觀
CONTROL_COMBO_BOX (IComboBox) 下拉式方塊控件的外觀
CONTROL_GENERIC (IControl) 可讓您使用大部分類型的控制啟用和可見狀態
CONTROL_LIST_VIEW (IListView) 提供清單檢視控件功能存取權的外觀
CONTROL_PROGRESS_BAR (IProgressBar) 處理進度列控件位置的外觀
CONTROL_RADIO_BUTTON (IRadioButton) 使用單選按鈕控件的外觀
CONTROL_STATIC_TEXT (IStaticText) 一個外觀,提供控件文字的讀取/寫入許可權,例如標籤或文本框
CONTROL_TREE_VIEW (ItreeView) 使用樹視圖控件的外觀

影像清單元件

此元件是您頁面上 ImageList 控制件的外觀。 您可以透過 IListViewITreeView 介面建立影像清單。

FormController 元件

精靈會為您建立此元件,並將它傳遞至您的頁面。 您可以使用WizardPageImpl 基類實作的 Form 方法,從您的頁面存取它。

InvalidCharacterValidator 元件

這是您可以在頁面上包含的驗證程序類型。 標識 符ID_InvalidCharactersValidator (定義於 IValidator.h) 中,其文字值為 “Microsoft.Wizard.Validation.InvalidChars”。

此驗證程式會在名為 InvalidChars 的 .config 檔案) 中尋找 setter 元素 (單一屬性,這是不允許的字元清單。 它會檢查文字框中的字元;如果文字包含此清單中的任何字元,則元件會報告失敗。

NonEmptyValidator 元件

這是您可以在頁面上包含的驗證程序類型。 標識 符ID_NonEmptyValidator (定義於 IValidator.h) 中,其文字值為 “Microsoft.Wizard.Validation.NonEmpty”。

如果文本框 (或任何其他支援 IStaticText 的控件) 具有空字串值,則此驗證程式會回報失敗。

PasswordValidator 元件

這是您可以在頁面上包含的驗證程序類型。 標識 符ID_PasswordValidator (定義於 IValidator.h) 中,其文字值為 “Microsoft.Wizard.Validation.Password”。

此驗證程式適用於兩個不同的文字控件, (支援 IStaticText) 的控件,如果它們不包含相同的值,則報告失敗。 換句話說,如果 [ 密碼 ] 和 [ 確認密碼 ] 文本框不相符,則會失敗。

因為此驗證程式需要兩個控件,所以需要比其他驗證程式更多的設定。 安裝程式看起來可能像這樣:

Form()->AddToGroup(IDC_EDIT_PASSWORD, IDC_EDIT_PASSWORD2);
PValidator pValidator;
Form()->AddValidator(IDC_EDIT_PASSWORD, ID_PasswordValidator, pMessage, &pValidator);
PStaticText pPassword2;
GetControlWrapper(View(), IDC_EDIT_PASSWORD2, CONTROL_STATIC_TEXT, &pPassword2);
pValidator->SetProperty(0, pPassword2);

首先,您會將 [確認密碼] 控件定義為 密碼 控件的「子系」。 如此一來,如果表單控制器停用 密碼 控制器停用密碼控制器,它也會停用 [確認密碼] 控制件。 接下來,將密碼驗證程式新增至表單。 最後,為密碼驗證程式提供 [ 確認密碼 ] 控件的介面。

由於兩個控件的需求,您必須使用程式代碼來設定此驗證程式,而不是 .config XML 檔案。

RegExValidator 元件

這是您可以在頁面上包含的驗證程序類型。 標識 符ID_RegExValidator (定義於 IValidator.h) 中,其文字值為 “Microsoft.Wizard.Validation.RegEx”。

此驗證程式會比較文字控件的內容 (支援 IStaticText) 與正則表示式的內容,如果文字不符合正則表達式,則會失敗。

或者,您可以使用此驗證程式搭配預先定義的具名模式。 若要使用正則表示式,XML 必須包含名為 Pattern 的 setter 屬性。 如果您想要改用具名模式,請使用名為 NamedPattern 的 setter 設定為表格 7 中的其中一個值。

表格 7 具名模式 Setter

Pattern 描述
使用者名稱 確認文字是窗體 domain\user 或 user@domain
ComputerName 名稱長度必須介於 1 到 15 個字元之間,且不能包含一組字元 (例如 : 和 ?)
Workgroup 名稱長度必須介於 1 到 15 個字元之間,且不能包含一組字元 (例如 =、+和 ?)

FactoryRegistry 元件

此元件會追蹤所有類別處理站和服務。 它會實作 IFactoryRegistry 介面,並可透過頁面的 Container 方法間接取得。 此外,登錄會載入延伸模組 DLL。 載入 DLL 之後,登錄會尋找名為 RegisterFactories 的導出函式。 您必須實作此函式,並在其中註冊頁面、工作和驗證程式的類別處理站 (以及您想要註冊) 的任何其他類別處理站。 以下是範例項目的範例:

extern "C" __declspec(dllexport) void RegisterFactories(IFactoryRegistry *factories)
{
Register<LocationPageFactory>(ID_LocationPage, factories);
}

記錄器元件

此元件可透過WizardPageImpl) 實作 (Logger方法提供給您的頁面使用。 您可以使用這個方法將專案寫入記錄檔。 記錄檔的內容對於診斷使用者可能執行UDI精靈的問題很有用。

PropertyBag 元件

屬性包是記憶體變數的容器。 您可以使用容器 () 屬性> () ,從您的頁面取得。 記憶體變數適用於在不同頁面之間傳遞暫存數據。

TSVariableBag 和 TSRepository 元件

TSVariableBag 元件可讓您讀取和寫入工作順序變數。 它會將值保留在記憶體中,直到使用者默認選取 [ 完成 (]) 。 您可以透過頁面的 TSVariables 方法存取 TSVariable 包, (由 WizardPageImpl 基類) 實作。 這些元件會記錄工作順序變數的所有讀取和寫入。

WmiRepository 元件

此元件提供使用 WMI 查詢的外觀。 您可以使用 ID_WmiRepository 呼叫 CreateInstance 協助程式函 ,以取得此元件的實例,該元件支援 IWmiRepository 介面。 此元件會透過 IWmiIterator 介面傳回結果記錄。

精靈頁面協助程序類別

您可以使用 UDI SDK 提供的內建協助程式類別來建立自定義 UDI 精靈頁面。 表 8 列出可用來建立自定義精靈頁面的協助程序類別。

表格 8 協助程序類別

Helper 類別 描述
ClassFactoryImpl 類別 這是一個實用的基類,可用來建立類別處理站,然後您可以向 Factory 登錄註冊。
介面範本類別 當您想要建置實作多個介面的元件時,請使用這個範本類別。
路徑協助程序類別 此類別提供常見的檔案/目錄作業。
指標範本類別 此類別提供 COM 元件中存留期管理的參考計數。 當您完成介面時,請務必釋放介面。 這個範本類別會自動處理存留期。
PUnknown 類別 此類別是專為 IUnknown 介面而設的智慧型指標。 對於所有其他介面,請使用指標範本類別。
StringUtil 協助程序類別 這個類別提供協助程式方法,可讓您更輕鬆地使用字串。
SubInterface 範本類別 這個基類可讓您更輕鬆地實作支援本身繼承自另一個介面之介面的元件。
UnknownImpl 範本類別 這個類別會處理建立 COM 元件的大部分詳細數據。
WizardComponent 範本類別 這個基類用於建立需要存取精靈服務的元件,例如元件建立和記錄。
WizardPageImpl 範本類別 這個基類應該作為所有自定義精靈頁面的基類

ClassFactoryImpl 類別

這是一個實用的基類,可用來建立類別處理站,然後您可以向 Factory 登錄註冊。

以下是範例專案中LocationPage.h檔案的摘錄,用來定義 ClassFactoryImpl 類別。

#pragma once

#include "ClassFactoryImpl.h"

class LocationPageFactory :public ClassFactoryImpl
{
protected:
    IUnknown *CreateNewInstance();
};

以下是範例精靈頁面中LocationPage.cpp檔案的摘錄,用來定義頁面的 Class Factory。

IUnknown *LocationPageFactory::CreateNewInstance()
{
    return static_cast<IWizardPage *>(new LocationPage);
}

介面範本類別

當您要建置實作多個介面的元件時,請使用此範本類別,例如:

classLocationPage :public Interface<IFieldCallback, WizardPageImpl<IDD_LOCATION_PAGE>>

此程式代碼會建立支援 IFieldCalback 的基類鏈結,以及 WizardPageImpl 支援的介面, (正好是 IWizardPage) 。

路徑協助程序類別

此類別提供常見的檔案/目錄作業:

static inline std::wstring GetModulePath(HINSTANCE hModule)

它也會使用您提供給這個方法的實例句柄,傳回 .exe 或 .dll 檔案的完整路徑:

static inline std::wstring GetModuleFilename(HINSTANCE hModule)

類別會傳回 .exe 的完整路徑和檔名,並使用您提供給這個方法的實例句柄來 .dll 檔案:

static inline std::wstring GetDirectoryName(LPCWSTR fullName)

. . . 或只是移除檔案名時的路徑:

static inline std::wstring GetFileName(LPCWSTR fullName)

指定具有檔案名的路徑時,路徑協助程式類別只會傳回檔名:

static inline std::wstring Combine(LPCWSTR path, LPCWSTR name)

最後, 類別會傳回新的字串,該字串是 (或另一個路徑) 的合併路徑和檔名。

指標範本類別

此類別定義於 Pointer.h 中。 由於 COM 元件會使用參考計數來進行存留期管理,因此當您完成介面時,請務必一律釋放介面。 Microsoft 提供自動處理存留期的範本類別。 例如,如果您想要 XML 介面的智慧型手機,您可以撰寫如下的內容:

Pointer<IXMLDOMNode> pNewChild
pXmlDom->CreateNode(NODE_ELEMENT, L"MyElement", L"", &pNewChild);

第一行會定義智慧型手機指標。 第二行顯示透過另一個呼叫擷取智慧型指標。 如果 & 運算子包含一個介面,它一律會釋放現有的介面,並傳回內部指標的位址。 一旦您擷取了類似這樣的指標,當變數超出範圍時, 指標 實例就會為您呼叫 Release 。 Microsoft 建議您使用智慧型指標,而不是手動呼叫 AddRefRelease

此外, 指標 智慧型指標類別會呼叫 QueryInterface ,為您擷取其他介面。 例如,當 Factory 登錄建立元件的新實例時,其程式代碼如下:

PWizardComponent pComp = pUnknown;
if (pComp != nullptr)
    pComp->SetContainer(m_pContainer);

第一行會在幕後呼叫 QueryInterface 來要求 IWizardComponent 介面。 如果元件不支援該介面,產生的智慧型手機會等於 nullptr

PUnknown 類別

此類別是專為 IUnknown 介面而設的智慧型指標。 對於所有其他介面,請使用 指標 範本類別。

StringUtil 協助程序類別

這個類別是在Utilities.h中定義,並提供協助程式方法,讓您更輕鬆地使用字串:

static inline int CompareIgnore(LPCWSTR first, LPCWSTR second)

這個方法會比較兩個字串,同時忽略大小寫 (請參閱表格 9) 。

表格 9 StringUtil 協助程序類別

返回 描述
0 字串相符,忽略大小寫
<0 第一 < 秒
>0 第一 > 秒

範例如下:

static inline std::wstring Format(LPCWSTR input, int index, LPCWSTR value)
static inline std::wstring Format(LPCWSTR input, int index, DWORD value)

這些方法與 Microsoft .NET Format 方法有點類似,因為參數的形式是 {0}。 不過,它們不會執行輸入的任何格式設定,只要替代:

static inline std::wstring Printf(std::wstring format, I val)
static inline std::wstring Printf(std::wstring format, I val1, J val2)
static inline std::wstring Printf(std::wstring format, I val1, J val2, K val3)
static inline std::wstring Printf(std::wstring format, I val1, J val2, K val3, L val4)

這些是 StringCchPrintf 周圍的包裝函式,會傳回 wstring ,因此您不需要自行配置字串或緩衝區的記憶體。

SubInterface 範本類別

這個基類可讓您更輕鬆地實作支援本身繼承自另一個介面之介面的元件。 例如, ICheckBox 介面繼承自 IControl。 以下是使用此類別來定義 CheckBoxWrapper 的方法:

classCheckBoxWrapper :public SubInterface<IControl, UnknownImpl<ICheckBox> >

基底介面是第一個參數,而衍生介面是第二個參數。

UnknownImpl 範本類別

此類別定義於 UnknownImpl.h 中,並處理建立 COM 元件的大部分詳細數據。 以下是如何使用這個基類的範例:

classDirectory :public UnknownImpl<IDirectory>

此程式代碼會定義支援 IDirectory 介面的類別。

WizardComponent 範本類別

這個類別是在 IWizardComponent.h 中定義,是一個實用的基類,可用來建立需要存取精靈服務的元件,例如元件建立和記錄。

例如,以下是 CopyFilesTask 元件的定義方式:

classCopyFilesTask :public WizardComponent<ITask>
{
    ...

此範本類別的 參數是您想要用於元件的“main” 介面,在工作案例中為 ITask。 使用 WizardComponent 表示您的元件支援您在此範例中提供 (ITask 的介面,) 和 IWizardComponent

每當您使用 Class Factory 登錄來建立新的元件時,登錄就會呼叫元件的 IWizardComponent-SetContainer> 方法,以提供精靈服務的元件存取權。

WizardPageImpl 範本類別

使用此類別作為自訂頁面的基類,例如:

class LocationPage :public WizardPageImpl<IDD_LOCATION_PAGE>

參數是對話框範本的資源標識碼。

精靈頁面介面

UDI 精靈會使用介面來存取頁面上的不同控件。 在頁面內,您可以使用 GetControlWrapper 函式來擷取控件包裝函式。 範例如下:

PStaticText pFormat;
GetControlWrapper(View(), IDC_CHECK_PARTITION, CONTROL_STATIC_TEXT, &pFormat);

在這裡, PStaticTextIStaticText 介面的智慧型手機。 智慧型指標會在超出範圍時自動呼叫 COM Release () 方法,或您將變數的地址傳遞 (,例如 &pFormat) 至方法。

IADHelper 介面

__interfaceIADHelper : IUnknown
{
    HRESULT Init(ILogger *pLogger);
    HRESULT ValidLogon(LPCTSTR userName, LPCTSTR password, LPCTSTR domain);
    HRESULT HasAccess(LPCTSTR username, LPCTSTR password, LPCTSTR domain, LPCTSTR computerName, LPCTSTR accountDomain);
};

HRESULT Init (ILogger *pLogger)

初始化此元件,並將其傳遞至記錄器,以便記錄資訊。

HRESULTValidLogon (LPCTSTR userName, LPCTSTR password, LPCTSTR domain)

這個方法會驗證一組認證是否有效,如表格 10 所示。

表 10. HResultValidLogon

HResult 描述
S_OK 認證有效
S_FALSE 認證無效
E_FAIL 找不到域控制器;檢查記錄以取得詳細數據
HRESULT HasAccess (LPCTSTR 使用者名稱、LPCTSTR 密碼、LPCTSTR 網域、LPCTSTR computerName、LPCTSTR accountDomain)

這個方法會驗證一組認證是否具有AD DS中計算機物件的讀取/寫入存取權,如表格11所示。

表 11. HResult HasAccess

HRESULT 描述
S_OK 使用者具有存取權
E_FAIL 用戶沒有存取權。 檢查記錄檔以取得其他資訊。

IBackgroundTask 介面

__interface IBackgroundTask : IUnknown
{
    HRESULT Init(ITask *pTask, int id, IBackgroundCallback *pCallback);
    void Start(void);
    BOOL Running(void);
    HRESULT Wait(DWORD waitMilliseconds);
    HRESULT Terminate(DWORD exitCode);
    HRESULT GetExitCode(LPDWORD pCode, HRESULT *pHresult);
    HRESULT Close(void);
};
概觀

[ 進度] 頁面會使用這個類別在個別的線程上執行工作。 每當您想要在個別的線程上執行作業時,也可以使用這個類別。 工作 是支援 ITask 介面的任何類別。

此介面是由IBackgroundTask.h 介面中定義的 ID_BackgroundTask (“Microsoft.Wizard.BackgroundTask”) 元件所實作。

HRESULT Init (ITask *pTask, int id, IBackgroundCallback *pCallback)

此介面會初始化元件,如表格 12 所示。

表 12. HRESULT Init

參數 描述
pTask 類別的指標,其中包含您想要在另一個線程上執行的程序代碼
Id 您可以在回呼的 Finished 方法中使用的數位,以分辨哪個工作已完成執行;如果您使用相同的回呼方法來啟動數個工作,這會很有用
pCallback 實作 Finished 方法的類別,每當工作完成執行時就會呼叫這個方法;Finished 方法的 呼叫會在背景線程上,而不是UI線程
void Start (void)

這個方法會在背景線程上啟動工作,並傳回表格 13 中顯示的專案。

表 13. 傳回背景線程

返回 描述
E_INVALIDARG 工作已在執行中,因此您無法立即啟動。
E_FAIL 啟動線程時發生問題。
S_OK 線程已啟動。
BOOL 執行中 ()

如果背景工作目前正在執行,這個方法會傳回 TRUE,如果背景工作未執行,則傳回 FALSE。

HRESULT Wait (DWORD waitMilliseconds)

這個方法會等到線程停止執行或經過毫秒數為止。

HRESULT 終止 (DWORD exitCode)

這個方法會終止執行中的線程, (請參閱表格 14 和表格 15) 。 此方法傳回之後,此程式可能需要一小段時間才能完成。

表 14. HRESULT 終止結束代碼

參數 描述
exitCode 將傳送至 Finished 回呼方法的結束代碼,也可從 GetExitCode 方法取得。

表 15. 終止代碼

返回 描述
E_FAIL 終止的呼叫失敗。
S_OK 終止線程的要求成功。
HRESULT GetExitCode (LPDWORD pCode, HRESULT *pHresult)

使用此方法取得在背景線程上執行工作的結果 (請參閱表格 16) 。

表 16. 結果碼

參數 描述
pCode DWORD 的指標,如果您不需要傳回值,則會在傳回時設定或 nullptr。 結束時,如果線程正在執行,則此參數會設定為 STILL_ACTIVE 、由工作的 Execute 方法傳回的程式代碼,或如果您呼叫該方法,則會將值傳遞至 Terminate 方法。
pHresult 傳回時將設定的 HRESULT 指標,如果您不需要 HRESULT 值,則為 nullptr
HRESULT 關閉 (void)

這個方法會釋放背景線程。 如果線程目前正在執行,則會傳回 E_INVALIDARG ,否則 S_OK

ICheckBox 介面

__interface ICheckBox : IControl
{
    void Check(BOOL check);
    BOOL IsButtonChecked();
};
void 檢查 (BOOL 檢查)

設定複選框的核取狀態。 當方法為TRUE時,會選取複選框;當方法為 FALSE 時,會清除複選框。

BOOL IsButtonChecked ()

這個方法會報告複選框目前的複選狀態。

IComboBox 介面

__interface IComboBox : IControl
{
    HRESULT Bind([in] IBindableList *pList);
    HRESULT Select(int index);
    int Selected(void);
    void Add([in] LPCTSTR caption);
    HRESULT GetText([out, retval] LPBSTR pText);
    void Clear();
};
概觀

這個介面是由 CheckBoxWrapper 元件實作。 您可以使用 GetControlWrapper 協助程式函式搭配類型CONTROL_COMBO_BOX來擷取此元件 的實例

HRESULT Bind ([in] IBindableList *pList)

當您有實作 IBindableList 介面的數據源時,請使用這個方法。 清單框會使用此清單中的標題來初始化內容。

HRESULT 選取 (int 索引)

在下拉式方塊中選取索引處的專案。

int Selected (void)

這個方法會傳回選取專案的索引,如果未選取任何專案,則 傳回 -1

void 新增 ([in] LPCTSTR 標題)

手動將專案新增至下拉式方塊。

HRESULT GetText ([out, retval] LPBSTR pText)

在下拉式方塊中擷取目前選取專案的字串。

void Clear ()

從下拉式方塊中移除所有專案。

IControl 介面

__interface IControl : IUnknown
{
    HRESULT SetEnable(BOOL enable);
    BOOL IsEnabled(void);
    HRESULT SetVisible(BOOL visible);
};
概觀

這個介面是由 ControlWrapper 元件實作。 您可以使用 GetControlWrapper 協助程式函式搭配類型CONTROL_GENERIC來擷取此元件 的實例

HRESULT SetEnable (BOOL 啟用)

啟用或停用控制件。

BOOL IsEnabled (void)

如果控件已啟用,則傳回 TRUE;否則傳回 FALSE。

HRESULT SetVisible (BOOL 可見)

顯示或隱藏控件。

ICpuInfo 介面

__interface ICpuInfo : IUnknown
{
    BOOL Is64Bit(void);
};
概觀

您可以建立新的 ID_CpuInfo 元件來取得此介面。 單一方法會報告 CPU 是 32 或 64 位。 請注意,如果您在64位電腦上有32位操作系統,這個方法會傳回TRUE,因為它只會報告CPU (的寬度,而不是操作系統) 。

IDirectory 介面
__interface IDirectory : IUnknown
{
    BOOL FileExists(LPCWSTR name);
    BOOL FindFirst([in] LPCWSTR name);
    HRESULT FoundName([out, retval] LPBSTR name);
    DWORD FoundAttributes(void);
    BOOL FindNext(void);
    void FinishFind(void);
};
概觀

您使用 ID_Directory 建立的目錄元件會提供外觀來處理檔案系統中的目錄。

BOOL FileExists (LPCWSTR 名稱)

如果具有您提供之名稱的檔案存在,這個方法會傳回 TRUE。

BOOL FindFirst ([in] LPCWSTR name)

這個方法會尋找您所提供名稱的第一個相符專案。 它支援通配符,並同時傳回檔案和目錄名稱。 如果找到相符專案,則方法會傳回 TRUE,否則傳回 FALSE。

HRESULT FoundName ([out, retval] LPBSTR name)

這個方法會擷取呼叫 FindFirstFindNext 所找到的檔名。

DWORD FoundAttributes (void)

這個方法會傳回最近找到之檔案或目錄的 屬性。 您可以使用下列程式代碼來測試它是否為目錄:

pDirectory->FoundAttributes() & FILE_ATTRIBUTE_DIRECTORY
BOOL FindNext (void)

尋找下一個。 如果找到另一個相符專案,這個方法會傳回 TRUE,否則傳回 FALSE。

void FinishFind (void)

這個方法會釋放用於尋找作業的資源。

IDomainJoinValidator 介面

__interface IDomainJoinValidator : IUnknown
{
    HRESULT Init(ILogger *pLogger, IWizardPageContainer *pContainer, IStaticText *pUsername, IStaticText *pPassword, IStaticText *pComputerName);
    HRESULT IsUsernameValid(LPCWSTR domainName);
    BOOL CanModifyComputerAdEntry(LPCWSTR domainName);
};
概觀

您可以使用 CreateInstance 範本函式的ID_DomainJoinValidator值來取得這個介面的實例。

HRESULT Init (ILogger *pLogger, IWizardPageContainer *pContainer, IStaticText *pUsername, IStaticText *pPassword, IStaticText *pComputerName)

初始化 實例,如表格 17 所示。

表 17. HRESULT Init - 實例初始化

參數 描述
pLogger 記錄器實例,可透過頁面的 Logger 方法供您的頁面使用
pContainer 從頁面的 Container 方法傳遞結果
pUsername 包含要驗證之使用者名稱的文字框
pPassword 包含要驗證之密碼的文字框
PComputerName 文字框,其中包含最終要加入網域的計算機名稱
HRESULT IsUsernameValid (LPCWSTR domainName)

這個方法會使用 IADHelper-ValidLogon> 方法來執行工作。 如需詳細資訊,請參閱該方法。

BOOL CanModifyComputerAdEntry (LPCWSTR domainName)

確認使用者是否有權修改計算機專案。 大部分的工作都是由 IADHelper-HasAccess> 完成。 如果這個方法傳回 FALSE,請檢查記錄檔以取得詳細數據。

IDriveList 介面

__interface IDriveList : IUnknown
{
    HRESULT Init(IWmiRepository *pWmi);
    HRESULT SetWhereClause(LPCTSTR whereClause);
    HRESULT SetMinimumDriveSize(__int64 size);
    HRESULT Update(void);
    HRESULT AddProperty(ENUM_DISK_QUERY_SECTION section, LPCTSTR propName, LPCTSTR propNameReturned);

    size_t Count(void);
    HRESULT GetProperty(size_t index, LPCTSTR propName,  LPVARIANT value);
    HRESULT GetCaption(size_t index,  LPBSTR pCaption);
}
HRESULT Init (IWmiRepository *pWmi)

呼叫任何其他元件之前,請先呼叫這個方法。 呼叫這個方法之前,您必須先建立新的 WmiRepository

HRESULT SetWhereClause (LPCTSTR whereClause)

這個方法可讓您新增在查詢中顯示為 「where」 子句的文字。 例如,下列這一行只會傳回USB磁碟驅動器:

pDrives->SetWhereClause(L"WHERE InterfaceType='USB'");
HRESULT SetMinimumDriveSize (__int64 大小)

針對將從查詢傳回的磁碟驅動器,設定最小化磁碟驅動器大小,以位元組為單位。

HRESULT 更新 (void)

執行查詢。 呼叫此方法之後可用的磁碟驅動器清單會依驅動器號排序。

HRESULT AddProperty (ENUM_DISK_QUERY_SECTION 區段、LPCTSTR propName、LPCTSTR propNameReturned)

這個方法會新增您想要在查詢結果中提供的其他屬性名稱。 呼叫 Update 之前,請先呼叫這個方法。 表 18 顯示三個有用的屬性。

表 18. HRESULT AddProperty:有用的屬性

Section 屬性 描述
DISKQUERY_LOGICALDISK 大小 以位元組為單位的大小,以字串表示
DISKQUERY_DISKPARTITION DiskIndex 以整數表示的磁碟編號,從 0 開始
DISKQUERY_LOGICALDISK VolumeName 磁碟區標籤
size_t (void)

查詢傳回的記錄數目。 呼叫 方法之前,請先呼叫 Update。

HRESULT GetProperty (size_t index、LPCTSTR propName、LPVARIANT 值)

這個方法會從查詢結果擷取屬性的值,如表格 19 所示。

表 19. HRESULT GetProperty

參數 描述
Index 結果記錄以零起始的索引
propName 屬性的名稱,例如 “Size”
傳回時,此參數包含 屬性的 variant 值
HRESULT GetCaption (size_t 索引,LPBSTR pCaption)

這個方法會擷取與 Caption 屬性相同的記錄 標題。

IImageList 介面

__interface IImageList
{
    HRESULT CreateImageList(int width, int height, UINT flags);
    HImageList GetImageList(void);
    int AddImage(HInstance hInstance, int resourceId);
};
概觀

此介面是由 ImageList 元件實作。 您可以從 IListView 介面擷取此元件的實例。

HRESULT CreateImageList (整數寬度、整數高度、UINT 旗標)

建立此元件所管理的新映像清單。 只呼叫這個方法一次。

HImageList GetImageList (void)

如果您需要在映像清單上執行其他作業,這個方法會傳回影像清單的句柄。

int AddImage (HInstance hInstance, int resourceId)

從資源將新影像新增至影像清單,如表格 20 所示。

表 20. HRESULT IImageList 介面

參數 描述
hInstance 包含位圖資源之模組的實例句柄
resourceId 要載入影像清單的資源識別碼

IListView 介面

__interface IListView : IControl
{
    int AddItem([in] LPCTSTR text);
    int AddColumn(int width, [in] LPCTSTR text);
    HRESULT SetSubItem(int index, int column, [in] LPCTSTR text);
    int GetWidth(void);
    void SetExtendedStyle(DWORD style);
    int GetSelectedItem(void);
    HRESULT SelectItem(int index);
    BOOL IsItemChecked(int index);
    int GetItemCount(void);
    HRESULT CreateImageList(int width, int height, UINT flags);
    int AddImage(HINSTANCE hInstance, int resourceId);
    HRESULT SetImage(int index, int imageIndex);
    HRESULT Clear(void);
};
概觀

這個介面是由 ControlWrapper 元件實作。 您可以使用 GetControlWrapper 協助程式函式搭配類型CONTROL_LIST_VIEW來擷取此元件 的實例

int AddItem ([in] LPCTSTR 文字)

將新的資料列新增至清單框。 方法會傳回剛才加入之專案的索引。

int AddColumn (int width, [in] LPCTSTR text)

將新數據行新增至清單檢視。

HRESULT SetSubItem (int index, int column, [in] LPCTSTR text)

在清單框第一欄以外的數據行中設定文字,如表格 21 所示。

表 21. HRESULT SetSubItem

參數 描述
index 您要修改之清單項目的索引
您要更新之數據行的索引;第一個數據行是以 AddItem 設定,第二欄和下列數據行是使用這個方法來設定
text 要顯示在數據行中的字串
int GetWidth (void)

這個方法會傳回整個文本框的寬度。

void SetExtendedStyle (DWORD 樣式)

此方法可讓您在清單框上設定擴充樣式,例如:

m_pList->SetExtendedStyle(LVS_EX_FULLROWSELECT);
int GetSelectedItem (void)

這個方法會傳回目前選取之清單檢視專案的索引。

HRESULT SelectItem (int 索引)

將清單中選取的項目設定為此索引。

BOOL IsItemChecked (int 索引)

如果選取清單中的項目,這個方法會傳回 TRUE。 這個方法會要求您呼叫 SetExtendedStyle 來設定複選框樣式。

int GetItemCount (void)

這個方法會傳回清單檢視中的項目數。

HRESULT CreateImageList (整數寬度、整數高度、UINT 旗標)

建立新的影像清單,並將其附加至清單檢視。

int AddImage (HINSTANCE hInstance, int resourceId)

將影像新增至清單檢視的影像清單。 您必須先呼叫 CreateImageList

HRESULT SetImage (int index, int imageIndex)

設定將在特定清單檢視專案左側顯示的影像。

HRESULT Clear (void)

從清單檢視中移除所有專案。

IProgressBar 介面

__interface IProgressBar : IControl
{
    HRESULT SetPercentage(int position);
    int GetPercentage(void);
};
概觀

此介面是由 ProgressBarWrapper 元件實作。 您可以使用 GetControlWrapper 協助程式函式搭配類型CONTROL_PROGRESS_BAR來擷取此元件 的實例

HRESULT SetPercentage (int position)

使用介於 0 和 100 之間的數位來設定進度列的位置。 根據預設,新的 Win32® 進度列的最大範圍為 100。

int GetPercentage (void)

這個方法會傳回進度列的目前位置。

IRadioButton 介面

__interface IRadioButton : IControl
{
public:
    void SetGroup(int firstId, int lastId);
    void CheckRadio(int id);
    BOOL IsButtonChecked(int id);
    void EnableRadio(int id, BOOL enable);
};
概觀

這個介面是由 RadioButtonWrapper 元件實作。 您可以使用 GetControlWrapper 協助程式函式搭配類型CONTROL_RADIO_BUTTON來擷取此元件 的實例

void SetGroup (int firstId, int lastId)

為包裝函式提供應視為群組的單選按鈕範圍。 呼叫 CheckRadio 之前,請先呼叫這個方法。

void CheckRadio (int id)

將特定單選按鈕設定為所選單選按鈕群組中的單一按鈕。 呼叫這個方法之前,請先呼叫 SetGroup

BOOL IsButtonChecked (int id)

如果目前已選取單選按鈕,這個方法會傳回 TRUE,否則會傳回 FALSE。

void EnableRadio (int id, BOOL enable)

這個方法會啟用或停用單選按鈕。

IStaticText 介面

__interface IStaticText : IControl
{
    HRESULT SetText([in] LPCTSTR pText);
    HRESULT GetText([out, retval] LPBSTR pText);
};
概觀

這個介面是由 StaticTextWrapper 元件實作。 您可以使用 GetControlWrapper 協助程式函式搭配類型CONTROL_STATIC_TEXT來擷取此元件 的實例

HRESULT SetText ([in] LPCTSTR pText)

設定控件的文字。

HRESULT GetText ([out, retval] LPBSTR pText)

這個方法會傳回控件文字的目前值。

ITask 介面

__interface IControl : IUnknown
{
    HRESULT Init(IStringProperties *pProperties, ISettingsProperties *pTaskSettings);
    HRESULT Execute(LPDWORD pReturnCode);
};

如果您想要在預檢頁面中以工作方式提供元件,或如果您想要使用 BackgroundTask 元件在背景線程上執行工作,請實作此介面。

以下是實作 ITask 介面的元件:

  • ID_ShellExecuteTask,L“Microsoft.Wizard.ShellExecuteTask”

  • ID_CopyFilesTask,L“Microsoft.Wizard.CopyFilesTask”

  • ID_ACPowerTask,L“Microsoft.OSDRefresh.ACPowerTask”

  • ID_WiredNetworkTask,L“Microsoft.SharedPages.WiredNetworkTask”

Init
HRESULT Init(IStringProperties *pProperties, ISettingsProperties *pTaskSettings)

如果您要撰寫預檢頁面的工作,請呼叫這個方法來初始化您的工作。 .config 檔案包含可能如下所示的 XML:

<Task DisplayName="Check Windows Scripting Host" Type="Microsoft.Wizard.ShellExecuteTask">
  <Setter Property="filename">%windir%\system32\cscript.exe</Setter>
  <Setter Property="parameters">Preflight\OSDCheckWSH.vbs</Setter>
  <Setter Property="BitmapFilename">images\WinScriptHost.bmp</Setter>
  <ExitCodes>
    <ExitCode State="Success" Type="0" Value="0" Text="" />
    <ExitCode State="Error" Type="-1" Value="*" Text="Windows Scripting Host not installed." />
  </ExitCodes>
</Task>

pProperties 參數可讓您存取三個 setter 值,而 pTaskSettings 參數則提供 Task 元素和子系的存取權。 大部分的工作只需要從 pProperties 參數讀取數據。

執行
HRESULT Execute(LPDWORD pReturnCode)

以下是您撰寫執行工作之程序代碼的位置。 如果沒有任何錯誤,這個方法應該會傳回 S_OK ,而且如果工作執行時發生錯誤,則可以傳回另一個 HRESULT 。 如果您使用預檢頁面,則此方法傳回S_OK以外的值會比對到 <ExitCodes> 區段中的 <Error> 元素。

pReturnCode 參數必須以報告工作狀態的數位來更新。 這些值會由預檢頁面 <與 ExitCode> 元素進行比對。

ITreeView 介面

__interface ITreeView : IControl
{
    void EnableCheckboxes(void);
    HRESULT CreateImageList(int width, int height, UINT flags);
    int AddImage(HINSTANCE hInstance, int resourceId);

    HTREEITEM AddItem(LPCTSTR text, HTREEITEM hParent = NULL);
    void SetImage(HTREEITEM item, int image, int expandImage);

    void Clear(void);
    BOOL SetFirstVisible(HTREEITEM item);
    BOOL SelectItem(HTREEITEM item);
    void CheckItem(HTREEITEM item, UINT checkState);
    HTREEITEM SelectedItem(void);
    int SetItemHeight(SHORT height);
    HRESULT EnableItem(HTREEITEM item, BOOL enable);
    void Expand(HTREEITEM hItem, BOOL expand);

    HTREEITEM GetChild(HTREEITEM hParent);
    HTREEITEM GetParent(HTREEITEM hNode);
    HTREEITEM GetNextItem(HTREEITEM hPrevious);

    UINT IsChecked(HTREEITEM item);
    BOOL IsEnabled(HTREEITEM item);

    INT_PTR CommonControlEvent(WORD controlId, void* pInfo, BOOL *pCancel);
    HRESULT SetEventHandler(ITreeViewEvent *pEventHandler);

    void SetSelectedBackColor(COLORREF color);
};
概觀

這個介面是由 TreeViewWrapper 元件實作。 您可以使用 GetControlWrapper 協助程式函式搭配類型CONTROL_TREE_VIEW來擷取此元件 的實例

void EnableCheckboxes (void)

此方法會藉由設定TVS_CHECKBOXES樣式,開啟樹視圖控件中的複 框。

HRESULT CreateImageList (整數寬度、整數高度、UINT 旗標)

將新的影像清單新增至樹視圖控件。 flags 參數會在呼叫 ImageList_Create Win32 函式時傳遞。

int AddImage (HINSTANCE hInstance, int resourceId)

使用實例句柄 hInstance,將影像從資源 (resourceId) 新增至映射清單。

HTREEITEM AddItem (LPCTSTR text, HTREEITEM hParent = NULL)

將節點新增至樹視圖。 如果 hParent 為 NULL,則會在最上層新增新節點。 否則,請提供您想要新增新專案的父專案句柄。 這個方法會傳回新專案的句柄。

void SetImage (HTREEITEM item, int image, int expandImage)

設定要用於樹視圖專案的影像。 您可以設定一般和展開的影像。

void Clear (void)

從樹檢視中移除所有專案。

BOOL SetFirstVisible (HTREEITEM 專案)

確定樹檢視專案是可見的。 樹視圖會視需要捲動,讓此項目可見。

BOOL SelectItem (HTREEITEM 專案)

將目前選取的項目設定為您提供的專案。 您可以在此之後呼叫 SetFirstVisible ,以確保可以看見新選取的專案。

void CheckItem (HTREEITEM item, UINT checkState)

方法基本上會設定將在樹視圖中顯示複選框的影像。 這些影像位於樹視圖所管理的個別 ImageList 控件中。 根據預設,此影像清單中有三個影像,如表格 22 所示。

表格 22.void CheckItem 影像列表預設值

checkState 描述
0 空白
1 清除
2 已選取
HTREEITEM SelectedItem (void)

這個方法會傳回目前選取之樹視圖專案的句柄。

int SetItemHeight (SHORT 高度)

這個方法會以像素為單位,設定樹視圖控件中所有專案的高度。 它會傳回上一個以像素為單位的高度。

HRESULT EnableItem (HTREEITEM 專案,BOOL enable)

這個方法會啟用或停用樹狀結構中的單一專案。 停用具有子系的專案不會停用子系。

void Expand (HTREEITEM hItem, BOOL expand)

這個方法會展開或折疊樹狀結構中的節點。

HTREEITEM GetChild (HTREEITEM hParent)

這個方法會傳回樹視圖專案的第一個子系,如果沒有子系,則傳回NULL。

HTREEITEM GetParent (HTREEITEM hNode)

這個方法會傳回樹視圖中節點的父句柄,如果節點位於最上層,則傳回 NULL。

HTREEITEM GetNextItem (HTREEITEM hPrevious)

您可以使用 GetChild 傳回的句柄來呼叫這個方法,以逐一查看節點的所有子系。 這個方法會傳回樹狀結構中共用相同父系的下一個同層級。

UINT IsChecked (HTREEITEM 專案)

如果未選取樹視圖節點,這個方法會傳回 0 ,如果選取則傳回 1

BOOL IsEnabled (HTREEITEM 專案)

如果已啟用樹視圖節點,這個方法會傳回 TRUE,否則傳回 FALSE。

INT_PTR CommonControlEvent (WORD controlId, void* pInfo, BOOL *pCancel)

這個方法僅供內部使用。

HRESULT SetEventHandler (ITreeViewEvent *pEventHandler)

如果您想要在選取的專案變更或用戶變更樹視圖專案的檢查狀態時收到通知,請呼叫這個方法。 您必須在元件中實作 ITreeViewEvent ,才能接收這些回呼。

void SetSelectedBackColor (COLORREF 色彩)

設定用於選取專案的背景色彩。

IWmiIteration 介面

__interface IWmiIterator : IUnknown
{
    HRESULT Next(void);
    HRESULT GetProperty(LPCTSTR propertyName, [out] LPVARIANT pValue);
};
概觀

使用 WMI 呼叫時,您通常會使用這個介面以及 IWmiRepositoryIWmiIteration 介面可讓您逐一查看查詢傳回的值。

HRESULT 下一 (void)

移至查詢結果中的下一個專案,如表格 23 所示。

表 23. HRESULT 下一個 (void) 查詢傳回

HRRESULT 描述
S_OK 已移至下一個結果;您可以使用 GetProperty 來擷取該結果的屬性。
S_FALSE 清單中沒有其他專案。
E_NOT_SET 沒有查詢結果
HRESULT GetProperty (LPCTSTR propertyName, [out] LPVARIANT pValue)

這個方法會從目前的結果記錄擷取屬性的值,如表格 24 和表格 25 所示。

表 24. HRESULT GetProperty

參數 描述
propertyName 您想要擷取的屬性名稱
pValue 指向傳回時包含屬性值的 VARIANT 結構

表 25. HRESULT GetProperty 結果

HRESULT 描述
S_OK 已擷取屬性值。
WBEM_E_NOT_FOUND 沒有具有名稱的屬性。
E_NOT_VALID_STATE 沒有目前記錄。

注意事項

GetProperty 方法可以傳回表格 25 中所列錯誤碼以外的其他 WMI 錯誤碼。 列出的值是傳回的常見結果。

IWmiRepository 介面

__interface IWmiRepository : IUnknown
{
    HRESULT SetNamespace(LPCWSTR namespaceName);
    HRESULT ExecQuery(LPCWSTR query, [out] IWmiIterator **ppIterator);
};
概觀

這個介面是由 WmiRepository 元件 (ID_WmiRepository) 實作。

HRESULT SetNamespace (LPCWSTR namespaceName)

這個方法會設定將用於查詢的WMI命名空間。 呼叫 ExecQuery 之前,請先呼叫這個方法。 如果您未呼叫這個方法,命名空間將會是 root\cimv2。 這個方法一律 會傳回S_OK

HRESULT ExecQuery (LPCWSTR query, [out] IWmiIterator **ppIterator)

對WMI 命名空間集執行查詢,並呼叫 SetNamespace,如表格 26 和表格 27 所示。

表 26. HRESULT ExecQuery

參數 描述
Query 您要執行之 WMI 查詢的字串
ppIterator 將指標傳遞至介面指標,該指標會在傳回時填入介面,讓您能夠存取查詢結果

表 27. HRESULT 查詢結果

HRESULT 描述
S_OK 查詢成功
其他 如果查詢未成功,則會傳回WMI HRESULT

IFormController 介面

__interface IFormController : IUnknown
{
    Init(IWizardPageView *pView, IWizardPageContainer *pContainer);
    SetPageInfo(ISettingsProperties *pPageInfo);

    Validate(void);

    AddToGroup(int groupControlId, int controlId);
    UpdateCheckGroup(int groupControlId);
    AddValidator(int controlId, IValidator *pValidator, IControl *pCOntrol = 0);

    AddValidator(int controlId, LPCWSTR validatorId, LPCWSTR message, IValidator **ppValidator = nullptr);
    DisableValidation(int controlId, BOOL disable);

    AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type);
    AddRadioGroup(LPCWSTR groupName, int radioControlId);
    EnableRadioGroup(LPCWSTR groupName, BOOL enable);
    InitFields(IFieldCallback *pFieldCallback = nullptr);
    SaveFields(IFieldCallback *pFieldCallback = nullptr);
    BOOL IsFieldDisabled(int controlId);

    InitSection(LPCWSTR key, LPCWSTR sectionCaption);
    AddSummaryItem(LPCWSTR first, LPCWSTR second);
    SuppressLogValue(LPCWSTR tsVariableName);
    SaveText(int controlId, LPCWSTR tsVariableName, LPCWSTR summaryCaption);
    LoadText(int controlId, LPCWSTR tsVariableName);

    void ControlEvent(WORD eventId, WORD controlId);
    BOOL IsValid(void);
 };
概觀

UDI 精靈中的每個頁面都有自己的表單控制器,可實作此介面。 您可以使用此控制器,將 .config XML 檔案中的欄位資料連接到頁面上的控制器。 然後,表單控制器會為您處理許多詳細數據。

設定表單

一般而言,請在頁面的 OnWindowCreated 方法中設定表單控制器。 這麼做通常牽涉到呼叫表格 28 中顯示的方法。

表 28. OnWindowCreated 方法

方法 描述
Init 初始化表單控制器
AddField 提供 .config XML 檔案中字串名稱的欄位與頁面對話框中識別碼的控制件之間的連接
AddRadioGroup 用來將單選按鈕連接至對話框中的群組和控件
AddToGroup 可讓您「子系」控件與其父代一起啟用或停用,或根據選取的單選按鈕
InitFields 呼叫所有 Add 方法以設定表單之後呼叫
Validate 執行初始驗證
處理表單事件

將下列呼叫新增至 您的 OnControlEvent 方法:

Form()->ControlEvent(eventId, controlId);

此呼叫會將事件傳遞至表單控制器,以便處理表單相關事件。

儲存表單數據

OnNextSelected 方法中,呼叫表格 29 中顯示的表單方法。

表 29. OnNextSelected 方法

方法 描述
InitSection 提供將在此頁面的 [ 摘要 ] 頁面上顯示的區段名稱
SaveFields 將域值儲存至工作順序變數和 [摘要] 頁面
Init
HRESULT Init(IWizardPageView *pView, IWizardPageContainer *pContainer)

您通常會在頁面的 OnWindowCreated 方法開頭附近呼叫這個方法。 命令看起來應該像這樣:

Form()->Init(View(), Container());
SetPageInfo
HRESULT SetPageInfo(ISettingsProperties *pPageInfo)

這個方法會在內部呼叫,您不應該自行呼叫它。 它會將頁面的 XML 提供給表單控制器。

驗證
HRESULT Validate(void)

這個方法會執行附加至控件的所有驗證程式。 如果驗證程式未通過,表單控制器會顯示警告訊息並停用 [ 下一步 ] 按鈕,然後停止處理驗證程式。 一般而言,您只需要在 OnWindowCreated 方法的結尾呼叫這個方法;它一律 會傳回S_OK

AddToGroup
AddToGroup(int groupControlId, int controlId)

這個方法會將控件新增為複選框或單選按鈕的「子系」,如表格 30 所示。 未選取父控件時,將會停用所有這類子控件。 方法一律 會傳回 S_OK

表 30. AddToGroup

參數 描述
groupControlId 將控制子控制器啟用狀態的複選框或單選按鈕標識碼
Controlld 您要新增為子系之控件的標識碼
UpdateCheckGroup
HRESULT UpdateCheckGroup(int groupControlId)

這個方法會根據父控件的狀態,更新群組子控件的啟用或停用狀態。 一般而言,您不需要自行呼叫這個方法,因為窗體控制器會為您呼叫它。

AddValidator
HRESULT AddValidator(int controlId, IValidator *pValidator, IControl *pControl = 0)

只有在您有想要在程序代碼中建立的驗證程式,而不是使用 XML 時,才呼叫這個方法。 這個方法一律 會傳回S_OK

AddValidator
HRESULT AddValidator(int controlId, LPCWSTR validatorId, LPCWSTR message, IValidator **ppValidator = nullptr)

只有在您有想要在程序代碼中建立的驗證程式,而不是使用 XML 時,才呼叫這個方法。

DisableValidation
HRESULT DisableValidation(int controlId, BOOL disable)

呼叫這個方法來明確停用控件的驗證程式或還原一般驗證,如表格 31 所示。 例如,當您針對窗體驗證未涵蓋的控件啟用/停用規則,而且需要停用控件的驗證時,這個方法就很有用。 換句話說,您通常不會呼叫這個方法。 這個方法一律 會傳回S_OK

表 31. HRESULT DisableValidation

參數 描述
controlId 您要啟用或停用驗證的控制件
Disable 設定為 TRUE 以停用驗證,並將設為 FALSE 以還原一般驗證
AddField
HRESULT AddField(LPCWSTR fieldName, int controlId, BOOL suppressLog, DialogControlTypes type)

在 .config XML 檔案的 Field 元素中的名稱與頁面對話框中的控件識別符之間新增控件對應,如表格 32 所示。 您必須在呼叫 InitFields 之前呼叫這個方法,因為 InitFields 會使用這項資訊。 這個方法一律 會傳回S_OK

表 32. HRESULT AddField

參數 描述
Fieldname 顯示在頁面 XML 中的功能變數名稱
controlId 頁面對話框範本中控件的標識碼
suppressLog 如果您不想將此欄位中的值寫入記錄檔,請設定為 TRUE;密碼或 PIN 欄位一律將此參數設定為 TRUE
類型 控制項的類型,這是下列其中一種:

- CONTROL_STATIC_TEXT
- CONTROL_COMBO_BOX
- CONTROL_LIST_VIEW
- CONTROL_PROGRESS_BAR
- CONTROL_GENERIC
- CONTROL_RADIO_BUTTON
- CONTROL_CHECK_BOX
- CONTROL_TREE_VIEW
AddRadioGroup
HRESULT AddRadioGroup(LPCWSTR groupName, int radioControlId)

這個方法會將控件新增至具名單選按鈕群組,如表格 33 所示。 您必須在 InitFields 方法之前呼叫此項目,因為該方法會使用 RadioGroup 元素上的屬性來控制群組中所有單選按鈕控件的設定。 例如,您可以鎖定單選群組,以便停用所有單選按鈕,但只根據選取的單選按鈕啟用或停用子控件。 這個方法一律 會傳回S_OK

表 33. HRESULT AddRadioGroup

參數 描述
groupName 定義此頁面上單選按鈕群組的字串
radioControlId 要新增至此群組的單一單選按鈕標識碼
EnableRadioGroup
HRESULT EnableRadioGroup(LPCWSTR groupName, BOOL enable)

這個方法可讓您啟用或停用整個單選按鈕群組。 停用單選群組會停用群組中的所有單選按鈕控件,以及已使用 AddToGroup 新增的任何單選按鈕子系。 請參閱表格 34 和表格 35。

表 34. EnableRadioGroup

參數 描述
groupName 您已使用 AddRadioGroup 呼叫定義的單選按鈕組名
Enable 設定為 TRUE 以啟用單選按鈕群組,並將 FALSE 設為 FALSE 以停用群組

表 35. HRESULT EnableRadioGroup

HRESULT 描述
S_OK 已啟用或停用群組
E_INVALIDARG 沒有包含您所提供名稱的單選按鈕群組
InitFields
HRESULT InitFields(IFieldCallback *pFieldCallback = nullptr)

呼叫這個方法之前,請針對 XML 可以控制的每個字段呼叫 AddField 。 這個方法一律 會傳回S_OK

pFieldCallback 參數是選擇性的。 如果您提供,表單控制器會針對不是CONTROL_STATIC_TEXTCONTROL_CHECK_BOX的控件呼叫 SetFieldDefault。 此行為可讓您從 XML 擷取預設值,並自行在控件中加以設定。

SaveFields
HRESULT SaveFields(IFieldCallback *pFieldCallback = nullptr)

這個方法會將域值儲存至工作順序變數,以及將顯示在 [ 摘要 ] 頁面上的摘要數據。 在 pFieldCallback 中 提供指標,可讓您處理不支援 CONTROL_STATIC_TEXT控件的儲存值

IsFieldDisabled
BOOL IsFieldDisabled(int controlId)

這個方法可讓您判斷 XML 中的欄位是否已停用。

InitSection
HRESULT InitSection(LPCWSTR key, LPCWSTR sectionCaption)

這個方法會初始化將在 [ 摘要 ] 頁面上顯示的摘要數據,如表格 36 所示。 呼叫 SaveFields 之前,請先在 OnNextSelected 方法中呼叫這個方法。 這個方法一律 會傳回S_OK

表 36. HRESULT InitSection

參數 描述
機碼 此參數對您的頁面而言應該是唯一的。 它是用來確保每個頁面都有自己的摘要資訊。
sectionCaption 將顯示在此頁面摘要資訊之 [摘要 ] 頁面上的標頭。 一般而言,您 會使用 DisplayName () 做為此參數的值。
AddSummaryItem
HRESULT AddSummaryItem(LPCWSTR first, LPCWSTR second)

這個方法可讓您將摘要專案新增至上方的 [ 摘要 ] 頁面,以及使用 XML 設定的專案之外。 請參閱表格 37。

表 37. HRESULT AddSummaryItem

參數 描述
第一個 摘要專案的 標題,其顯示在左側
Second 將顯示在右側的值
SuppressLogValue
HRESULT SuppressLogValue(LPCWSTR tsVariableName)

針對您不想將值寫入記錄檔的工作順序變數呼叫此方法。 針對儲存密碼、PIN 或使用者可能輸入之其他敏感值的工作順序變數呼叫此方法。

SaveText
HRESULT SaveText(int controlId, LPCWSTR tsVariableName, LPCWSTR summaryCaption)

這個方法會將文字控件的值儲存至工作順序變數和摘要區段。 一般而言,您不需要自行呼叫此方法,因為窗體控制器會針對所有字段執行此動作。 請參閱表格 38。

表格 38. HRESULT SaveText

參數 描述
controlId 文字框的識別碼,其中包含您想要儲存 (或任何其他可傳回文字的控件)
tsVariableName 您要修改的工作順序變數名稱
summaryCaption 此值之 [摘要] 頁面上的 標題
LoadText
HRESULT LoadText(int controlId, LPCWSTR tsVariableName)

這個方法會讀取工作順序變數的值,並將文本框設定為此值。

ControlEvent
void ControlEvent(WORD eventId, WORD controlId)

您的 OnControlEvent 方法上呼叫這個方法,以確保表單控制器可以處理控制事件,而必須執行此動作才能正確運作。 您傳遞給這個方法的值與傳遞給 OnControlEvent 方法的值相同。

IsValid
BOOL IsValid(void)

這個方法會傳回表單最新驗證的狀態。 如果任何控件驗證程序回報錯誤,這個方法會傳回 FALSE。 換句話說,只有在頁面上的所有控件都有效時,才會傳回 TRUE。

IValidator 介面

__interface IValidator : IUnknown
{
    HRESULT Init(IControl *pControl, LPCTSTR message);
    HRESULT Init(IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties);
    BOOL, IsValid(LPBSTR pMessage);
    HRESULT SetProperty(int propertyId, LPVARIANT pValue);
    HRESULT SetProperty(int propertyId, IUnknown *pUnknown);
    HRESULT SetProperty)(int propertyId, LPCTSTR pValue);
};
概觀

驗證程式 是可驗證頁面上單一控件的元件。 實作驗證程式最簡單的方式是讓它成為 BaseValidator 類別的子類別,其定義於BaseValidator.h頭檔中。

HRESULT Init (IControl *pControl, LPCTSTR 訊息)

如果您在程式代碼中建立驗證程式,您可以呼叫這個方法來初始化驗證程式。 請參閱表格 39。

表 39. HRESULT Init

參數 描述
pControl 驗證程式必須驗證的控制件
訊息 如果控件無效,要顯示在頁面上的訊息
HRESULT Init (IControl *pControl, IWizardPageContainer *pContainer, IStringProperties *pProperties)

表單控制器會呼叫這個方法,以根據頁面的 XML 初始化它所建立的驗證程式。 請參閱表格 40。

表 40. HRESULT Init 方法

參數 描述
pControl 驗證程式必須驗證的控制件
pContainer 如果您的驗證程式需要存取記錄器,或需要建立其他元件
pProperties 提供驗證程式 (setter 元素) 屬性的存取權
BOOL、IsValid (LPBSTR pMessage)

如果控件有效,這個方法會傳回 TRUE;如果控件無效,則傳回 FALSE。 傳回時, pMessage 應該填入新的 BSTR ,其中包含控件無效時要顯示的訊息。

HRESULT SetProperty (int propertyId, LPVARIANT pValue)

如果您需要 XML 中未提供的額外值,您可以實作這個方法。

HRESULT SetProperty (int propertyId, IUnknown *pUnknown)

如果您需要 XML 中未提供的額外值,您可以實作這個方法。

HRESULT SetProperty) (int propertyId, LPCTSTR pValue)

如果您需要 XML 中未提供的額外值,您可以實作這個方法。

IRegEx 介面

__interface IRegEx : IUnknown
{
    BOOL MatchesRegex(LPCTSTR input, LPCTSTR regex);
    HRESULT GetMatch(size_t index, LPBSTR pValue);
};

這個方法是由 ID_Regex 元件 (IRegex.h) 實作,並提供正則表達式處理的支援。

BOOL MatchesRegex (LPCTSTR input, LPCTSTR regex)

這個方法會針對輸入文字執行正則表達式。 它會使用 C++ 標準連結庫的 regex_match 函式 來執行實際工作。 如果有相符專案,則方法會傳回 TRUE,否則會傳回 FALSE。

HRESULT GetMatch (size_t 索引,LPBSTR pValue)

這個方法可讓您從最近的 MatchesRegex 呼叫擷取相符專案。 請注意,這個方法中沒有任何錯誤處理,它會傳回 S_OK 或擲回例外狀況。

ISummaryInfo 介面

__interface ISummaryInfo : IUnknown
{
    size_t Count(void);
    HRESULT Clear(void);
    HRESULT AddInfo(LPCTSTR pFirst, LPCTSTR pSecond);
    HRESULT GetInfo(size_t index, LPBSTR pFirst, LPBSTR pSecond);
    HRESULT GetCaption(LPBSTR pCaption);
    HRESULT SetCaption(LPCTSTR caption);
};

您不應該直接使用此介面。 請改用 IFormController

ISummaryBag

__interface ISummaryBag : IUnknown
{
    size_t Count(void);
    HRESULT GetInfoByIndex(size_t index, [out] ISummaryInfo **ppSummary);
    HRESULT GetInfoByKey(LPCTSTR key, [out] ISummaryInfo **ppSummary);
};

您不應該直接使用此介面。 請改用 IFormController

ITSVariableBag 介面

__interface ITSVariableBag : IUnknown
{
    void GetValue([in] LPCTSTR variableName, [out] LPBSTR pValue);
    void SetValue([in] LPCTSTR variableName, [in] LPCTSTR pValue);
    void Clear(void);
    HRESULT Remove([in] LPCTSTR variableName);
    HRESULT SuppressLogValue([in] LPCTSTR variableName);
    void Save(void);
};

此介面可讓您存取工作順序變數。 您可以使用頁面的 TSVariables () 方法來存取此介面。

void GetValue ([in] LPCTSTR variableName, [out] LPBSTR pValue)

這個方法會讀取工作順序變數的值。

注意事項

值會在第一次讀取之後快取。

void SetValue ([in] LPCTSTR variableName, [in] LPCTSTR pValue)

這個方法會設定工作順序變數的值。 此值會儲存在記憶體中。 當您在 UDI 精靈中選取 [ 完成 ] 之後,就會寫入工作順序值。

void Clear (void)

這個方法會移除已儲存在記憶體中的所有工作順序值。

HRESULT 移除 ([in] LPCTSTR variableName)

這個方法會從記憶體中移除特定的工作順序值。 下次您使用相同的工作順序名稱呼叫 GetValue 時,方法會嘗試從工作順序擷取它。

HRESULT SuppressLogValue ([in] LPCTSTR variableName)

每當寫入工作順序變數時,例如當您在 UDI 精靈中選取 [ 完成 ] 時,名稱和值都會寫入記錄檔。 呼叫這個方法來隱藏特定工作順序變數的敏感性值記錄,例如密碼或 PIN。

void 儲存 (void)

這個方法會儲存呼叫 SetValue 所設定的所有工作順序值。

ITSVariableRepository 介面

__interface ITSVariableRepository : IUnknown
{
    void GetValue([in] LPCTSTR variableName, BOOL logValue, [out] LPBSTR pValue);
    void SetValue([in] LPCTSTR variableName, BOOL logValue, [in] LPCTSTR value);
};

此介面可供 TSVariableBag 內部使用,以讀取和寫入工作順序變數。

IWizardFinish 介面

__interface IWizardFinish : IUnknown
{
    HRESULT Canceled(void);
    HRESULT Finished(void);
};

在您想要在 UDI 精靈中選取 [ 完成 ] 或 [ 取消 ] 時執行其他處理的進階案例中,此介面非常有用。 UDI 精靈包含 [ 完成 ] 工作,可在您選取 [ 完成] 時儲存工作順序變數。 如果您取消精靈,工作只會將 OSDSetupWizCancelled 工作順序變數設定為TRUE,而且不會將變更儲存到任何其他工作順序變數。

如果您建立自己的完成元件,您需要向如下的程式代碼註冊它:

Register<MyFinishTaskFactory>(ID_MyFinishTask, pRegistry);

PWizardFinish pFinish;
CreateInstance(pRegistry, ID_MyFinishTask, &pFinish);

PWizardFinishService pService;
GetService<IWizardFinishService>(pRegistry, &pService);

pService->Register(pFinish);

IBindableList 介面

__interface IBindableList : IUnknown
{
    size_t Count(void);
    HRESULT GetCaption(size_t index, LPBSTR pCaption);
};

如果您有想要透過呼叫其 Bind 方法系結至下拉式方塊的數據源元件,請實作此介面。

size_t (void)

這個方法會傳回清單中的項目數。

HRESULT GetCaption (size_t 索引,LPBSTR pCaption)

這個方法會傳回位於特定索引處的專案 標題。

IDataNodes 介面

__interface IDataNodes : IUnknown
{
    size_t Count();
    HRESULT SetCaptionProperty(LPCTSTR captionProperty);
    HRESULT GetProperty(size_t index, LPCTSTR propertyName, [out] LPBSTR propertyValue);
    HRESULT GetNode(size_t index, [out] ISettingsProperties **ppNode);
};

此介面可讓您存取可儲存在頁面中的階層式數據。 您可以透過 ISettingsProperties 介面上的方法取得此介面,這可透過 Settings 方法供您的頁面使用。

頁面 XML 中的數據看起來可能像這樣

      <Data Name="Network">
        <DataItem>
          <Setter Property="DisplayName">Public</Setter>
          <Setter Property="Share">\\servername\Share</Setter>
        </DataItem>
        <DataItem>
          <Setter Property="DisplayName">Dev Team</Setter>
          <Setter Property="Share">\\servername\DevShare</Setter>
        </DataItem>
      </Data>

呼叫 Settings () -GetDataNode> (L“Network”,&pData) 為您提供 一個 IDataNodes 實例,其中有兩個數據項 (每一個都具有兩個屬性) 。

size_t計數 ()

這個方法會傳回 DataItem 元素的數目。

HRESULT SetCaptionProperty (LPCTSTR captionProperty)

支援此介面的元件也支援 IBindableList,可讓您輕鬆地在下拉式方塊中填入頁面 XML 中的數據。 這個方法會控制每個 DataItem 元素中 (setter) 將用於此系結的屬性。 例如,您可以使用 DisplayName 呼叫這個方法,它會使用該 setter 屬性進行數據系結。 然後,下拉式方塊會包含 PublicDev Team 作為專案。

HRESULT GetProperty (size_t index, LPCTSTR propertyName, [out] LPBSTR propertyValue)

這個方法會從其中一個 DataItem 元素取得屬性。 請參閱表格 41 和表格 42。

表 41. DataItem GetProperty

參數 描述
Index 索引值 (從您要擷取屬性值的 DataItem 0) 開始
propertyName 您要擷取值的 setter 屬性名稱
propertyValue 傳回時,包含屬性的字串值

表 42. HRESULT GetProperty

HRESULT 描述
S_OK 已擷取屬性。
E_INVALIDARG 索引超過陣組結尾。
HRESULT GetNode (size_t index, [out] ISettingsProperties **ppNode)

這個方法類似於 GetProperty,但不會從 DataItem 傳回一個值,而是會傳回包裝在 ISettingsProperties 介面中的整個 DataItem。 請參閱表格 43 和表格 44。

表 43. HRESULT GetNode

參數 描述
索引 索引值 (從您要擷取屬性值的 DataItem 0) 開始
ppNode 結束時,包裝 DataItem 節點的 ISettingsProperties 介面

表 44. HRESULT GetNode 結果

HRESULT 描述
S_OK 已擷取節點。
E_INVALIDARG 索引超過陣組結尾。

IFactoryRegistry 介面

__interface IFactoryRegistry : IUnknown
{
    void Register(LPCTSTR type,  IClassFactory *pFactory);
    HRESULT LoadAndRegister(LPCTSTR dllName, ILogger *pLogger);
    BOOL Contains(LPCTSTR type);
    HRESULT GetFactory(LPCTSTR type,  IClassFactory **ppFactory);
    HRESULT CreateInstance(LPCTSTR type,  IUnknown **ppInstance);
    HRESULT SetContainer(IWizardPageContainer *pContainer);
    HRESULT RegisterService(REFGUID iid, IUnknown *pService);
    HRESULT GetService(REFGUID iid,  IUnknown **ppService);
};
概觀

當您建立新的自定義頁面時,至少需要建立 頁面處理站,這是實作 IClassFactory 的類別。 (您可以使用 ClassFactoryImpl 作為 factory.) 的基類

void Register (LPCTSTR type, IClassFactory *pFactory)

這個方法會向登錄註冊類別處理站。 請參閱表格 45。

表 45. IClassFactory void Register

參數 描述
Type 識別您要註冊之處理站的字串;一般而言,此參數在字串中應該有您的公司名稱,以確保它是唯一的
pFactory 類別處理站實例的指標
HRESULT LoadAndRegister (LPCTSTR dllName, ILogger *pLogger)

這個方法僅供內部使用。

BOOL 包含 (LPCTSTR 類型)

這個方法通常供內部使用。 它會檢查類別處理站是否已註冊類型。

HRESULT GetFactory (LPCTSTR 類型,IClassFactory **ppFactory)

這個方法可讓您擷取 Class Factory。 一般而言,您會呼叫 CreateInstance。 不過,如果您要建立大量相同的元件,則擷取處理站,然後要求它為您建立實例會更有效率。

HRESULT CreateInstance (LPCTSTR 類型,IUnknown **ppInstance)

這個方法會根據元件的類型,建立元件的新實例。 請改用 CreateInstance 範本方法,以允許建立型別安全物件。

HRESULT SetContainer (IWizardPageContainer *pContainer)

這個方法僅供內部使用。

HRESULT RegisterService (REFGUID iid, IUnknown *pService)

服務 是元件的單一實例,可用於多個位置。 您可以使用這個方法在一個頁面上註冊服務,然後從另一個頁面擷取該相同的實例。

HRESULT GetService (REFGUID iid, IUnknown **ppService)

這個方法會擷取先前透過呼叫 RegisterService 註冊的服務。

HRESULT SetLanguage (LANGID languageId)

這個方法會將 UDI Wizard 的語言設定為您在 languageId 參數中提供的語言標識碼。

LANGID GetLanguage ()

這個方法會傳回您為UDI Wizard提供 /locale 命令行參數的語言標識碼值。 方法會傳回下列其中一個值:

  • /locale 命令行參數所提供的語言標識符值

  • 0,如果您未提供 /locale 命令行參數

ILogger 介面

__interface ILogger : IUnknown
{
    HRESULT Init(LPCWSTR logFilename);
    HRESULT MoveLog(LPCWSTR logFilename);
    HRESULT LogBase(EMessageType messageType, LPCTSTR component, SYSTEMTIME eventTime, LPCTSTR message);
    HRESULT Log(EMessageType messageType, LPCTSTR component, LPCTSTR message);
    HRESULT Error(HRESULT error, LPCTSTR component, LPCTSTR message);
    HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2);
    HRESULT Normal(LPCTSTR component, LPCTSTR message);
    HRESULT Normal2(LPCTSTR component, LPCTSTR message, LPCTSTR message2);
    HRESULT Verbose(LPCTSTR component, LPCTSTR message);
    HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2);
    HRESULT Debug(LPCWSTR component, LPCWSTR message);
    HRESULT EnableDebug(BOOL debug);
    HRESULT Close(void);
    HRESULT GetLogFilename(LPBSTR pFilename);
};
概觀

UDI 精靈會將資訊記錄到記錄檔,以協助針對欄位中找到的問題進行疑難解答。 建議您的頁面記錄資訊。 您可以使用頁面的 Logger () 方法,從頁面內取得此介面的指標。 記錄檔中的行包含代表錯誤、一般、詳細資訊或偵錯訊息的「層級」數位。

注意事項

除非開啟偵錯支援,否則偵錯訊息不會儲存至記錄檔。 您可以將下列程式代碼行新增至 .config 檔案中的 Style 元素,以開啟偵錯支援:

<Setter Property="debug">true</Setter>
Init
HRESULT Init(LPCWSTR logFilename)

這個方法僅供內部使用。

MoveLog
HRESULT MoveLog(LPCWSTR logFilename)

這個方法僅供內部使用。

LogBase
HRESULT LogBase(EMessageType messageType, LPCTSTR component, SYSTEMTIME eventTime, LPCTSTR message)

這個方法僅供內部使用。

記錄
HRESULT Log(EMessageType messageType, LPCTSTR component, LPCTSTR message)

這個方法僅供內部使用。

錯誤
HRESULT Error(HRESULT error, LPCTSTR component, LPCTSTR message)

呼叫這個方法來記錄錯誤的相關信息。 請參閱表格 46。

表 46. HRESULT 錯誤

參數 描述
錯誤 呼叫所傳回的錯誤碼 (此程式代碼會以數字顯示在記錄專案中。)
元件 識別錯誤來源的字串,通常是您的頁面或您已撰寫的元件
訊息 說明造成錯誤原因的訊息
Error2
HRESULT Error2(HRESULT error, LPCTSTR component, LPCTSTR message, LPCTSTR message2)

這個方法就像 Error 方法,但可讓您提供兩部分的訊息。 最後一則訊息的輸出檔中會有 「message」,然後是 「message2」。。 這隻是方便的方法。

一般
HRESULT Normal(LPCTSTR component, LPCTSTR message)

這個方法會記錄一般訊息。 如需參數,請參閱 Error 方法的描述。

Normal2
HRESULT Normal2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)

這個方法會記錄一般訊息。 如需參數,請參閱 Error2 方法的描述。

詳細資訊
HRESULT Verbose(LPCTSTR component, LPCTSTR message)

這個方法會記錄詳細資訊訊息。 如需參數,請參閱 Error 方法的描述。

Verbose2
HRESULT Verbose2(LPCTSTR component, LPCTSTR message, LPCTSTR message2)

這個方法會記錄詳細資訊訊息。 如需參數,請參閱 Error2 方法的描述。

偵錯
HRESULT Debug(LPCWSTR component, LPCWSTR message)

這個方法會記錄偵錯訊息。 如需參數,請參閱 Error 方法的描述。 除非啟用,否則偵錯訊息不會儲存至檔案。 如需詳細資訊,請參閱概觀一節。

EnableDebug
HRESULT EnableDebug(BOOL debug)

這個方法僅供內部使用。

關閉
HRESULT Close(void)

這個方法僅供內部使用。

GetLogFilename
HRESULT GetLogFilename(LPBSTR pFilename)

這個方法會擷取記錄檔的名稱。

IOrientation 介面

__interface IOrientation : IUnknown
{
    void SetController(IWizardDialogController *pController);
    int AddPage(LPCTSTR name);
    void SelectPage(int index);
};

此介面僅供內部使用。

ISettings 介面

__interface ISettings : IUnknown
{
    int NumDlls();
    int NumPages();

    HRESULT SetStage(LPCWSTR stageName);
    HRESULT GetDllName(long index, __out LPBSTR pDllName);
    HRESULT GetPageInfo(long index, __out ISettingsProperties **ppPageInfo);
    HRESULT GetStyle(__out ISettingsProperties **ppStyleInfo);
};

此介面僅供內部使用。

ISettingsProperties 介面

__interface ISettingsProperties : IUnknown
{
    HRESULT GetAttribute(LPCTSTR attributeName, __out LPBSTR attributeValue);
    IStringProperties * Properties();
    HRESULT SelectNodes(LPCTSTR xPath, __out IXMLDOMNodeList **ppList);
    HRESULT SelectSingleNode(LPCTSTR xPath, __out IXMLDOMNode **ppNode);
    HRESULT GetDataNode(LPCTSTR name, __out ISettingsProperties **ppNode);
    HRESULT GetDataNodes(__out IDataNodes **ppNodes);
    HRESULT GetChildDataNodes(LPCTSTR childeName, __out IDataNodes **ppNodes);
};
概觀

此介面可讓您存取頁面數據。 若要取得頁面數據的最上層,請使用頁面的 Settings () 方法。

HRESULT GetAttribute (LPCTSTR attributeName, LPBSTR attributeValue)

當您使用頁面的 Settings () 方法時,這個方法可讓您擷取主要節點上的屬性值,也就是 Page 節點。

IStringProperties * 屬性 ()

這個方法可讓您存取主要節點下的 setter 屬性值。 針對頁面,這些是最上層屬性。

HRESULT SelectNodes (LPCTSTR xPath, IXMLDOMNodeList **ppList)

如果您想要使用 XPath 表達式直接取得 XML 節點清單,請呼叫這個方法。 如果可以的話,最好使用其他方法之一。 只有當您無法以任何其他方式進入節點時,才使用此方法。

HRESULT SelectSingleNode (LPCTSTR xPath, IXMLDOMNode **ppNode)

如果您想要使用 XPath 運算式直接取得單一 XML 節點,請呼叫這個方法。 如果可以的話,最好使用其他方法之一。 只有當您無法以任何其他方式進入節點時,才使用此方法。

HRESULT GetDataNode (LPCTSTR name, ISettingsProperties **ppNode)

根據該元素的 Name 屬性擷取 Data 元素。

HRESULT GetDataNodes (IDataNodes **ppNodes)

這個方法會擷取目前節點下的 DataItem 項目清單。 從頁面層級,呼叫 GetDataNode 以擷取數據的 ISettingsProperty 介面。 然後,在該實例上呼叫 GetDataNodes 以擷取記錄清單。 例如,假設有下列 XML:

    <Page ...>
      <Data Name="Network">
        <DataItem>
          <Setter Property="DisplayName">Public</Setter>
          <Setter Property="Share">\\servername\Share</Setter>
        </DataItem>
        <DataItem>
          <Setter Property="DisplayName">Dev Team</Setter>
          <Setter Property="Share">\\servername\DevShare</Setter>
        </DataItem>
      </Data>
PSettingsProperties pData;
Settings()->GetDataNode(L"Network", &pData);
PDataNodes pNodes;
pData->GetDataNodes(&pNodes);
HRESULT GetChildDataNodes (LPCTSTR childeName, IDataNodes **ppNodes)

這個方法可讓您快速取得特定 [數據] 節點下的 DataItem 節點集合。 使用 GetDataNodes 範例中的 XML,下列程式代碼的執行方式與 GetDataNodes 下範例中的四行程式代碼完全相同,但會檢查錯誤:

ISimpleStringProperties Interface

ISimpleStringProperties 介面

__interface ISimpleStringProperties : IStringProperties
{
void Add(LPCTSTR propertyName, LPCTSTR value);
};

這個介面本身可能不實用。 不過,它是由 ID_SimpleStringProperties 元件實作,這也會實作 IStringProperties 介面。 如果您需要將一組屬性傳遞給另一個元件,例如工作,但您想要以程序設計方式加入值,而不是使用來自 XML 的值,您可以使用此元件。 以下是如何使用此介面的範例:

PSimpleStringProperties *pProperties;
CreateInstance(Container(), ID_SimpleStringProperties, &pProperties);
pProperties->Add(L"filename", L"%windir%\\system32\\cscript.exe");
pTask->Init(pProperties, nullptr);
IStringProperties
__interface IStringProperties : IUnknown
{
    HRESULT Get(LPCTSTR propertyName, [out] LPBSTR pPropValue);
};

此介面可讓您輕鬆存取來自 XML 的一組 setter 元素。 此介面適用於使用 [設定] () 屬性> () 的頁面屬性。

HRESULT 取得 (LPCTSTR propertyName, [out] LPBSTR pPropValue)

這個方法會擷取單一屬性值。 請參閱表格 47 和表格 48。

表格 47. IHRESULT 取得屬性值

參數 描述
propertyName 您要讀取的屬性名稱
pPropValue 結束時,會以字串形式包含屬性值 (如果沒有這類屬性,這個值會是 nullptr 。)

表格 48. IHRESULT 取得屬性值結果

HRESULT 描述
S_OK 擷取屬性值。
E_INVALIDARG 沒有具有您所提供名稱的屬性。

ITaskManager 介面

__interface ITaskManager : IUnknown
{
    HRESULT Init(IWizardPageView *pPageView, int idListView, int idMessage, int idRetryButton, ISettingsProperties *pPageInfo, ITaskManagerCallback *pCallback);
    HRESULT SetFailMessage(LPCWSTR message);

    HRESULT Start(void);

    HRESULT GetTaskMessage(size_t index, LPBSTR message);
    HRESULT GetResultType)(size_t index, LPBSTR type);
    HRESULT GetProperty(size_t index, LPCTSTR propertyName, LPBSTR value);
    int GetSelectedIndex(void);
    HRESULT Wait(DWORD waitMilliseconds);
    size_t FailedCount(void);
    size_t WarningCount(void);
    size_t SucceedCount(void);
    size_t RunningCount(void);

    void OnCommonControlEvent(WORD controlId, LPNMHDR pInfo);
    void OnControlEvent(WORD eventId, WORD controlId);
    void EnableButtons(BOOL enable);
}

此介面是由ITaskManager.h) 中的 TaskManager 元件 ( ID_TaskManager實作,這是在預檢頁面上執行工作的元件。 您可以直接使用預檢頁面,這是您大部分的時間執行的作業,或建置您自己的頁面,讓此元件執行大部分的工作。

HRESULT Init (IWizardPageView *pPageView, int idListView, int idMessage, int idRetryButton, ISettingsProperties *pPageInfo, ITaskManagerCallback *pCallback)

您必須先呼叫這個方法,再呼叫任何其他方法。 它會初始化 TaskManager 元件。 請參閱表格 49。

表 49. HRESULT Init

參數 描述
pPageView 提供將執行工作之頁面的存取 (此頁面必須有一組特定的控件,如下幾個參數中所述。)
idListView ListView 控件的控件標識碼,該控件會顯示工作清單和這些工作的狀態
idMessage 文字框的控件識別碼,該文字框將用來顯示您選取之工作的訊息
idRetryButton 您可以選取以再次執行工作的按鈕控制項識別碼
pPageInfo 頁面 XML (TaskManager 周圍的包裝函式會載入要從此 XML 執行的工作集 )
pCallback 可以是 null (如果此參數不是 null,TaskManager 會在啟動工作時呼叫 Started 方法,並針對每個完成執行的工作呼叫 Finished 方法。)
HRESULT SetFailMessage (LPCWSTR 訊息)

這個方法會設定當一或多個工作失敗時將顯示的訊息。

HRESULT start (void)

這個方法會啟動所有工作。 每個工作都是在個別的線程上啟動。

HRESULT GetTaskMessage (size_t 索引,LPBSTR 訊息)

這個方法僅供內部使用。 它會根據工作清單中的索引,擷取工作的目前訊息。

HRESULT GetResultType) (size_t 索引,LPBSTR 類型)

這個方法會擷取工作的目前「類型」。 表 50 顯示可用的類型。

表 50. HRESULT GetResultType

類型 描述
0 表示成功的工作
1 表示傳回警告的工作
-1 表示失敗的工作

藉由查看工作的結束或錯誤碼,並在工作的 <ExitCodes> XML 元素中尋找相符專案,來擷取類型。

HRESULT GetProperty (size_t index、LPCTSTR propertyName、LPBSTR 值)

進度和預檢頁面會使用這個方法來擷取 BitmapFilename setter 屬性,以便在您反白顯示之工作的訊息旁邊顯示影像。 換句話說,您可以將自定義 setter 新增至工作的 XML,然後使用這個方法來擷取它。

int GetSelectedIndex (void)

這個方法會擷取目前選取任務的索引,如果您想要擷取工作的其他相關信息,這會很有用 (請參閱 GetProperty 方法) 顯示選取的任務。 進度和預檢頁面會使用這個方法來顯示所選取工作的影像。

HRESULT Wait (DWORD waitMilliseconds)

這個方法主要有助於單元測試,讓測試可以確保工作在單元測試結束之前完成。 您通常不會呼叫這個方法。 它會在所有工作都完成執行或等候時間已過時傳回 。

size_t FailedCount (void)

這個方法會傳回目前標示為失敗的工作數目。

size_t WarningCount (void)

這個方法會傳回目前標示為警告的工作數目。

size_t SucceedCount (void)

這個方法會傳回目前標示為成功的工作數目。

size_t RunningCount (void)

這個方法會傳回目前正在執行的工作數目。

void OnCommonControlEvent (WORD controlId, LPNMHDR pInfo)

從頁面的 OnCommonControlEvent 呼叫這個方法,讓 TaskManager 可以處理它所需的事件。

void OnControlEvent (WORD eventId, WORD controlId)

從頁面的 OnControlEvent 呼叫這個方法,讓 TaskManager 可以處理它所需的事件。

void EnableButtons (BOOL enable)

這個方法僅供內部使用。

IWizardComponent 介面

__interface IWizardComponent : IUnknown
{
    HRESULT SetContainer(IWizardPageContainer *pContainer);
};
概觀

一般而言,您不會直接實作此介面,而是透過 WizardComponent 範本類別來實作。 如果您的元件實作此介面,而且您已向登錄註冊 Class Factory,則元件會在建立 IWizardPageContainer 實 例時收到指標。 例如,這可協助您存取記錄器或登錄,以建立元件可能需要的其他元件。

IWizardDialogController 介面

__interface IWizardDialogController : IUnknown
{
    void Initialize(ISettings *pSettings);
    void InitPages(void);
    void Start();
    void Next();
    void Finish();
    void Previous();
    int NumPages();
    void Cancel();

    HRESULT Focus(WizardButtons button);
    HRESULT SetEnable(WizardButtons button, BOOL enable);
    void ShowWarningMessage(LPCTSTR message);
    void HideWarningMessage();

    void ChangePage(size_t newIndex);
    IUnknown *CurrentPage(void);
    HRESULT GetCurrentTitle([out, retval] LPBSTR pDisplayName);
};

此介面僅供內部使用。

IWizardDialogView 介面

__interface IWizardDialogView : IUnknown
{
    HRESULT LoadBannerImage(LPCTSTR bannerFilename);
    HRESULT LoadPage(LPCTSTR pageType, ISettingsProperties *pPageSettings, IWizardPageView **view);
    HRESULT SetEnable(WizardButtons button, BOOL enable);
    HRESULT Focus(WizardButtons button);
    void EnableFinish(BOOL isFinish);
    void Exit(int exitCode);
    void ShowWarningMessage(LPCTSTR message);
    void HideWarningMessage(void);
    void SetTitle(LPCTSTR title);
    void SetPageTitle(LPCTSTR title);
    int ShowMessageBox(LPCTSTR message, LPCTSTR lpCaption, UINT uType);
    HWND GetHwnd(void);
    void UpdateFocus(void);
};

此介面僅供內部使用。

IWizardPage 介面

__interface IWizardPage : IUnknown
{
    HRESULT SetPageSettings(ISettingsProperties *pPageSettings);
    HINSTANCE GetInstanceHandle(void);
    int GetDialogResourceId(void);
    void WindowCreated(IWizardPageView *pView, IWizardPageContainer *pContainer);
    void WindowShown(void);
    void WindowHidden(void);

    HRESULT NextSelected(void);
    void ControlEvent(WORD eventId, WORD controlId);
    void CommonControlEvent(WORD controlId, LPNMHDR pInfo, LPBOOL pCancel);
    void UnhandledEvent(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
};
概觀

此介面是由 WizardPageImpl實作,因此您通常不需要自行實作此介面。 當精靈與您的自定義頁面互動時,會為您呼叫所有這些方法。

IWizardPageContainer 介面

__interface IWizardPageContainer : IUnknown
{
    ILogger * Logger(void);
    IPropertyBag * Properties(void);
    HRESULT CreateInstance(LPCTSTR type, [out] IUnknown **ppInstance);
    HRESULT GetService(REFIID iid, [out] IUnknown **ppInstance);
    HRESULT ReplaceVariables(LPCTSTR source, [out] LPBSTR pDest);
    HRESULT GotoPage(LPCTSTR pageName);
    int ShowMessageBox(LPCTSTR message, LPCTSTR lpCaption, UINT uType);
    BOOL InPreview(void);
    HWND GetHwnd(void);
};
概觀

此介面可透過WizardPageImpl) 實作的 Container 方法 (,讓您存取精靈的各種服務。

ILogger * 記錄器 (void)

使用此方法將訊息寫入記錄檔,例如:

Logger()->Verbose(s_component, L"Message for log file");
IPropertyBag * void (屬性)

這個方法提供「記憶體」變數的存取權,這些變數是只有在UDI精靈執行時才存在於記憶體中的屬性。 這些屬性可供程序代碼中的其他頁面使用,或使用 $memoryVarName$ 語法在 XML 中使用。

HRESULT CreateInstance (LPCTSTR type, [out] IUnknown **ppInstance)

這個方法可讓您建立任何已註冊之元件的新實例。 不過,最好使用範本函式 CreateInstance,因為它是強型別。

HRESULT GetService (REFIID iid, [out] IUnknown **ppInstance)

這個方法可讓您擷取已註冊的服務。 不過,最好呼叫 GetService 範本函式,這是強型別 (,而不是使用 IUnknown) 。

HRESULT ReplaceVariables (LPCTSTR source, [out] LPBSTR pDest)

這個方法會處理字串值內的變數。 它支援表格 51 和表格 52 中顯示的格式。

表 51. HRESULT ReplaceVariables

Format 描述
$Name$ 將記憶體變數的值取代為此名稱 (如果名稱沒有記憶體變數,則會移除 「token」。。)
%Name% 工作順序變數或環境變數。 順序如下:

1.如果有的話,請使用工作順序變數的值。
2.如果有的話,請使用環境變數的值。
3.否則,請從字串中移除此文字。

表 52. HRESULT 參數

參數 描述
Source 輸入字串,可以包含任何和 % 變數的$組合,或完全不包含
pDest 傳回時,包含新的字串,其中已根據表格 51 取代所有令牌
HRESULT GotoPage (LPCTSTR pageName)

這個方法尚未經過完整測試。 其概念是您可以根據 .config XML 檔案中定義的頁面名稱,直接切換至特定頁面。 呼叫此方法會略過您頁面上的 OnNextSelected 。 此外,此方法的行為可能會變更,因此請自行承擔風險。

int ShowMessageBox (LPCTSTR message, LPCTSTR lpCaption, UINT uType)

這個方法會顯示一個消息框,其中包含您提供的文字和 標題。 uType 參數是您可以提供給 MessageBox Win32 函式的任何值。

BOOL InPreview (void)

如果您藉由提供 /preview 參數,以「預覽」模式啟動精靈,這個方法會傳回 TRUE。 在預覽模式中,[ 下一步 ] 按鈕永遠不會停用。 此方法可讓您略過預覽模式中的程式代碼,例如,當頁面上沒有有效數據時,可能會造成問題。

HWND GetHwnd (void)

這個方法會傳回主要對話框的 HWND 。 請小心使用這個方法。 一般而言,UDI Wizard 應用程式開發介面的設計目的是讓您永遠無法直接使用視窗句柄。

IWizardPageView 介面

__interface IWizardPageView : IUnknown
{
    HRESULT GetControlWrapper(int itemId, DialogControlTypes controlType, IUnknown **ppControl);
    HWND GetHwnd(void);
    HWND GetControl(int itemId);
    HRESULT Show (void);
    HRESULT Hide(void);
    HRESULT Focus(int itemId);
    IWizardPage * Page(void);
    IFormController * Form(void);

    HRESULT FocusWizardButton(WizardButtons button);
    HRESULT SetEnable(WizardButtons button, BOOL enable);
    void ShowWarningMessage(LPCTSTR message);
    void HideWarningMessage(void);
};

此介面可透過WizardPageImpl) 實作的 View 方法 (,讓您頁面中的程式代碼使用。

HRESULT GetControlWrapper (int itemId, DialogControlTypes controlType, IUnknown *ppControl)

UDI 精靈會使用 包裝函式,這些包裝函式實際上是與頁面上控件互動的外觀。 使用這些外觀而非實際控件,可讓您更輕鬆地撰寫頁面的測試,因為您可以從測試中提供模擬外觀。

與其直接使用此方法,最好是使用強型別 的 GetControlWrapper 範本方法,例如:

PComboBox m_pLanguagePackCombo;
GetControlWrapper(View(), IDC_MY_COMBO, CONTROL_COMBO_BOX, &m_pCombo);
HWND GetHwnd (void)

這個方法會傳回頁面的視窗句柄。 一般而言,您應該不需要存取此視窗句柄。

HWND GetControl (int itemId)

如果您必須這麼做,您可以呼叫這個方法來取得頁面上控件的視窗句柄。 (最好將 GetControlWrapper 範本函式呼叫) 。

HRESULT 顯示 (void)

這個方法僅供內部使用。

HRESULT 隱藏 (void)

這個方法僅供內部使用。

HRESULT Focus (int itemId)

將輸入焦點設定為特定控制件。

IWizardPage * page (void)

這個方法僅供內部使用。

IFormController * 窗體 (void)

這個方法僅供內部使用。

HRESULT FocusWizardButton (WizardButtons 按鈕)

將焦點設定為精靈的其中一個按鈕。WizardButtons 有兩個值: BackButtonNextButton

HRESULT SetEnable (WizardButtons 按鈕,BOOL 啟用)

要求啟用或停用其中一個精靈按鈕。 按鈕可能不符合您要求的狀態。 例如,如果您使用 /preview 參數執行 UDI Wizard,則一律會啟用按鈕。 WizardButtons 有兩個值: BackButtonNextButton

void ShowWarningMessage (LPCTSTR 訊息)

這個方法會在頁面內容區域的底部顯示警告訊息。 此訊息可以是您想要的任何文字。

void HideWarningMessage (void)

隱藏您在呼叫 ShowWarningMessage 時顯示的警告訊息。

IXmlDocument 介面

__interface IXmlDocument : IUnknown
    HRESULT Load(LPCTSTR filename);
    HRESULT LoadXml(LPCTSTR xml);
    HRESULT Save(LPCWSTR filename);
    HRESULT GetParseErrorMessage(LPBSTR pMessage);
    HRESULT SelectNodes(LPCTSTR xpath, IXMLDOMNodeList **ppNodes);
    HRESULT SelectSingleNode(LPCTSTR xpath, IXMLDOMNode **ppNode);
    HRESULT AddSchema(LPCTSTR filename, LPCTSTR ns);
    HRESULT AddAttribute(IXMLDOMNode *pNode, LPCWSTR name, LPCWSTR value);
    HRESULT CreateNode(DOMNodeType type, LPCWSTR name, LPCWSTR ns, IXMLDOMNode **ppNode);
};
概觀

這個介面是由 ID_IXmlDocument 元件實作,這是設計來讓您更輕鬆地在 C++ 中使用 XML 檔的外觀。

HRESULT 載入 (LPCTSTR 檔名)

這個方法會從外部檔案載入 XML 檔。 如果檔案載入時沒有發生錯誤,則會傳回S_OK,或在發生錯誤時S_FALSE。 發生錯誤時,您可以呼叫 GetParseErrorMessage 來取得錯誤訊息。

HRESULT LoadXml (LPCTSTR xml)

這個方法會從字串載入 XML 檔,而不是從外部檔案載入。 除了讀取 XML 的來源之外,行為與 Load 方法相同。

HRESULT 儲存 (LPCWSTR 檔名)

這個方法會將記憶體中的 XML 檔儲存至外部檔案。

HRESULT GetParseErrorMessage (LPBSTR pMessage)

如果載入 XML 檔,這個方法會傳回含有錯誤訊息的新字串。 它一律 會傳回S_OK

HRESULT SelectNodes (LPCTSTR xpath, IXMLDOMNodeList **ppNodes)

這個方法可讓您使用 XPath 運算式從檔擷取節點集合。 它一律 會傳回S_OK

HRESULT SelectSingleNode (LPCTSTR xpath, IXMLDOMNode **ppNode)

這個方法可讓您使用 XPath 運算式從檔擷取一個節點。 它一律 會傳回S_OK

HRESULT AddSchema (LPCTSTR 檔名,LPCTSTR ns)

這個方法會新增外部架構檔案的名稱,以在載入 XML 檔時用來驗證其架構。 您提供的命名空間是您可以在 XPath 查詢中使用的字串,雖然尚未測試過。

HRESULT AddAttribute (IXMLDOMNode *pNode, LPCWSTR name, LPCWSTR value)

這個方法會將新屬性新增至 XML 檔中的現有節點。 請參閱表格 53。

表 53. HRESULT AddAttribute

參數 描述
pNode 您要加入屬性的節點
名稱 新屬性的名稱
新屬性的值
HRESULT CreateNode (DOMNodeType type, LPCWSTR name, LPCWSTR ns, IXMLDOMNode **ppNode)

呼叫此方法以建立新的節點:

Pointer<IXMLDOMNode> pNewChild
pXmlDom->CreateNode(NODE_ELEMENT, L"MyElement", L"", &pNewChild);

建立新節點之後,您可以呼叫父系的 appendChild 方法,將它新增為另一個節點的子節點。

Helper 函式

CreateInstance 範本函式

HRESULT CreateInstance(IWizardPageContainer *pContainer, LPCTSTR type, I **ppObject)

此函式定義於 IWizardPageContainer.h 中,並透過 IWizardPageContainer-CreateInstance> 方法提供類型安全包裝函式,例如:

CreateInstance<IDirectory>(Container(), ID_Directory, &pDirectory);

此程式代碼會建立新的 ID_Directory 元件,以擷取該元件的 IDirectory 介面。

GetService 範本函式

void GetService(IWizardPageContainer *pContainer, I **ppService)

此函式定義於 IWizardPageContainer.h 中,並透過 IWizardPageContainer-GetService> 方法提供類型安全包裝函式,例如:

GetService<ITSVariableBag>(Container(), &pTsBag);

此函式會擷取支援 ITSVariableBag 介面的工作順序元件。 (針對 ITSVariableBag,您可以改用 WizardPageImpl 類別的 TSVariables 方法。)

UDI 精靈 Designer 組態檔架構參考

UDI Wizard Designer 會取用此檔案。 每個自定義 .dll 檔案都會建立個別的檔案,其中可以包含自定義精靈頁面編輯器、自定義工作或自定義驗證程式。 檔案必須以 .config 結尾,並位於 installation_folder\Bin\Config 資料夾 (其中 installation_folder 是您安裝 MDT) 的資料夾。

表 54 列出 UDI Wizard 中的專案 Designer 組態檔及其描述。 DesignerConfig 元素是這個參考的根節點。

表 54. UDI 精靈中的元素 Designer 組態檔及其描述

專案名稱 描述
DesignerConfig 指定所有其他元素的根目錄
DesignerMappings 將一組 Page元素分組
Page 指定要在 UDI Wizard Designer 中載入的精靈頁面編輯器,用來編輯精靈頁面的組態設定
參數 指定傳遞至父 TaskValidator 元素的參數,並對應至 UDI Wizard 組態檔中的 Setter 元素 注意: 如果父代是 TaskValidator 元素,此元素的屬性會不同。
工作 指定工作連結庫內的工作
TaskItem 指定傳遞至工作的參數群組
TaskLibrary 將一組 Task 元素分組
驗證 指定驗證程式連結庫內的驗證程式
ValidatorLibrary 將一組 Validator 元素分組

DesignerConfig

此元素會指定所有其他專案的根。

項目資訊

表 55 提供 DesignerConfig 元素的相關信息。

表 55. DesignerConfig 元素資訊

屬性
發生次數 一:此元素為必要專案。
父元素
內容 DesignerMappingsTaskLibraryValidatorLibrary
項目屬性

這個項目沒有屬性。

註解

無。

範例
<DesignerConfig>
   + <TaskLibrary>
   + <ValidatorLibrary>
   + <DesignerMappings>
</DesignerConfig>

DesignerMappings

此元素會將一組 Page 元素分組。

項目資訊

表 56 提供 DesignerMappings 元素的 相關信息。

表 56. DesignerMappings 元素資訊

屬性
發生次數 DesignerConfig 元素內的零或一個 (如果 DLL 中沒有對應到此 UDI Wizard Designer 組態檔的自定義精靈頁面,則此元素是選擇性的。)
父元素 DesignerConfig
內容 Page
項目屬性

這個項目沒有屬性。

註解

無。

範例
<DesignerConfig>
   + <TaskLibrary>
   + <ValidatorLibrary>
   - <DesignerMappings>
        <Page DLL="SharedPages.dll"
           Description="Used to display text that describes the current stagegroup"
           Type="Microsoft.SharedPages.WelcomePage"
           DisplayName="Welcome"
           Image="Welcome_188.png"
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.WelcomePageView"
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>
        <Page DLL="OSDRefreshWizard.dll"
           Description="Captures or restores user state data"
           Type="Microsoft.OSDRefresh.UserStatePage"
           DisplayName="User Data"
           Image="UserState_188.png"
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.UserStatePageView"
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>
        <Page DLL="OSDRefreshWizard.dll"
           Description="Allows selecting the image to install, target drive, and whether to format"
           Type="Microsoft.OSDRefresh.VolumePage"
           DisplayName="Volume"
           Image="Volume_188.png"
           DesignerType="Microsoft.Enterprise.UDIDesigner.CoreModules.Views.VolumePageView"
           DesignerAssembly="Microsoft.Enterprise.UDIDesigner.CoreModules.dll"/>
     </DesignerMappings>
</DesignerConfig>

頁面

此元素會指定要在 UDI Wizard Designer 中載入的精靈頁面編輯器,然後用來編輯精靈頁面的組態設定。

項目資訊

表 57 提供 Page 元素的相關信息。

表 57. Page 元素資訊

屬性
發生次數 DesignerMappings 元素中定義的每個精靈頁面都有一或多個
父元素 DesignerMappings
內容 任何格式正確的 XML 內容
項目屬性

表 58 列出 Page 元素的屬性,以及每個專案的描述。

表格 58. Page 元素的屬性和對應值

屬性 描述
描述 指定提供參數相關信息的文字,該參數會顯示在 UDI Wizard Designer
DesignerAssembly 指定與精靈頁面編輯器相關聯的 .dll 檔名稱 (.dll 檔案必須存在於 installation_folder\Bin 資料夾 (,其中 installation_folder 是您安裝 MDT.)
DesignerType 指定 DesignerAssembly 屬性中指定之 .dll 檔案內的精靈頁面編輯器名稱 (這是精靈頁面編輯器的 Microsoft .NET 類型,具有完整的 Microsoft .NET 命名空間.)
DisplayName 指定頁面編輯器的使用者易記名稱,此名稱會顯示在UDI Wizard Designer
Dll 指定與精靈頁面相關聯的 .dll 檔名稱 (.dll 檔案必須存在於 installation_folder\Templates\Distribution\Tools\platform 資料夾 (其中 installation_folder 是您安裝 MDT 的資料夾,而 平臺x86 ,而 x64 則適用於 64 位版本。) 附注: 請確定 DLL 處理器架構符合安裝的 MDT 處理器架構。 例如,如果您已安裝 32 位版本的 MDT,請確定您使用 32 位 DLL 作為精靈頁面。
影像 指定 [可攜式網络圖形] (PNG 格式) 格式的頁面影像名稱 (.png 檔案必須存在於 installation_folder\Bin\Images 資料夾 (其中 installation_folder 是您安裝 MDT.)
類型 指定精靈頁面編輯器,而且必須符合註冊自定義頁面時所使用的具名
註解

UDI Wizard Designer 會使用Page元素,例如範本來建立新精靈的初始 XML。 UDI 精靈 Designer 執行架構驗證,以確保Page和子元素具有有效的格式。 此元素提供 UDI Wizard 頁面類型與 UDI Wizard Designer 使用自定義頁面編輯器編輯和建立此類型頁面所需的資訊之間的對應。

範例

無。

參數

此元素指定傳遞至父 TaskValidator 元素的參數,並對應至 UDI Wizard 組態檔中的 Setter 元素。

注意事項

如果父系是 TaskValidator 元素,則這個項目的屬性會不同。

項目資訊

表 59 提供 Param 元素的相關信息。

表格 59. Param 元素資訊

屬性
發生次數 每個 TaskItemValidator 父元素一或多個
父元素 TaskItemValidator
內容 任何格式正確的 XML 內容
項目屬性

表 60 列出 Param 元素的屬性,並提供每個屬性的描述。

表格 60. Param 元素的屬性和對應值

屬性 描述
描述 指定提供參數相關信息的文字,該參數會顯示在UDI Wizard Designer 注意:此屬性僅適用於 Validator 元素。
DisplayName 指定驗證程序參數的使用者易記名稱,這會針對UDI Wizard中的適當[UDI 精靈] 頁面顯示 Designer (此名稱通常比 Name 屬性更具描述性。) 注意:此屬性僅適用於 Validator 元素。
名稱 指定傳遞至工作或驗證程式的參數名稱,視父元素而定 (此屬性會成為 UDI Wizard 組態檔中 Setter 元素中的 Property 屬性。) 注意:此參數同時用於 TaskItemValidator 父元素。
註解

無。

範例

無。

工作

此元素會指定工作連結庫內的工作。

項目資訊

表 61 提供 Task 元素的相關信息。

表格 61. 任務項目資訊

屬性
發生次數 TaskLibrary 元素內的一或多個 (如果已指定 TaskLibrary 元素,則此元素不是選擇性的。)
父元素 TaskLibrary
內容 TaskItem
項目屬性

表 62 列出 Task 元素的屬性,並提供每個屬性的描述。

表 62. Task 元素的屬性和對應值

屬性 描述
描述 指定提供工作相關信息的文字,該工作會顯示在 UDI Wizard Designer
Dll 指定與工作相關聯的 .dll 檔名 (.dll 檔案必須存在於 installation_folder\Templates\Distribution\Tools\platform 資料夾 (,其中 installation_folder 是您安裝 MDT 的資料夾,而 32 位版本的 平臺x86,64 位版本則為 x64 。)
名稱 指定工作名稱,此名稱會顯示在適當的 UDI Wizard 頁面和 UDI Wizard Designer
類型 指定工作類型,該工作類型會向處理站登錄註冊,並用來呼叫 .dll 檔案內的特定工作
註解

無。

範例

無。

TaskItem

此元素會指定傳遞至工作的參數群組。

項目資訊

表 63 提供 TaskItem 元素的相關信息。

表 63. TaskItem 元素資訊

屬性
發生次數 每個 Task 元素都有一或多個
父元素 工作
內容 參數
項目屬性

表 64 列出 TaskItem 元素的屬性,並提供每個屬性的描述。

表 64. TaskItem 元素的屬性和對應值

屬性 描述
Type 指定將在 UDI Wizard 組態檔中建立的項目類型。 將會建立對應至這個屬性值的 XML 專案。 例如,如果這個屬性的值是 File,則會在 UDI Wizard 組態檔中建立 File 元素。

目前唯一支援的值為:

- 檔案,需要兩個 Param 子專案 (一個 Param 子專案, 並將 Name 屬性設定為 Source ,而另一個 Param 子專案將 Name 屬性設定為 Dest)
- Setter,需要一個 Param 子專案
註解

無。

範例

無。

TaskLibrary

此元素會將一組 Task 元素分組。

項目資訊

表 65 提供 TaskLibrary 元素的相關信息。

表 65. TaskLibrary 元素資訊

屬性
發生次數 DesignerConfig 元素內的零個或一個 (如果 DLL 中沒有任何對應於此 UDI Wizard Designer 組態檔的自定義工作,此元素是選擇性的。)
父元素 DesignerConfig
內容 工作
項目屬性

這個項目沒有屬性。

註解

無。

範例
<DesignerConfig>
   - <TaskLibrary>
        +<Task DLL="" Description="Executes a process with the given command line." Type="Microsoft.Wizard.ShellExecuteTask" Name="Shell Execute Task">
        +<Task DLL="OSDRefreshWizard.dll" Description="Discovers supported applications for install." Type="Microsoft.OSDRefresh.AppDiscoveryTask" Name="Application Discovery">
        +<Task DLL="SharedPages.dll" Description="Check to ensure a wired network connection is available." Type="Microsoft.SharedPages.WiredNetworkTask" Name="Wired Network Check">
        +<Task DLL="OSDRefreshWizard.dll" Description="Check to ensure power source is AC (not battery)." Type="Microsoft.OSDRefresh.ACPowerTask" Name="AC Power Check">
        +<Task DLL="" Description="Check to ensure power source is AC (not battery)." Type="Microsoft.Wizard.CopyFilesTask" Name="Copy Files Task">
     </TaskLibrary>
   + <ValidatorLibrary>
   + <DesignerMappings>
</DesignerConfig>

驗證

這個專案會指定驗證程式連結庫內的驗證程式。

項目資訊

表 66 提供 Validator 元素的相關信息。

表 66. Validator 元素資訊

屬性
發生次數 ValidatorLibrary 元素內的零或多個 (此元素是選擇性的。)
父元素 ValidatorLibrary
內容 參數
項目屬性

表 67 列出 Validator 元素的屬性,並提供每個屬性的描述。

表 67. Validator 元素的屬性和對應值

屬性 描述
描述 指定提供驗證程式相關信息的文字,此資訊會顯示在 UDI Wizard Designer
DisplayName 指定 UDI Wizard 中顯示之驗證程式的使用者易記名稱 Designer (此名稱通常比 Name 屬性更具描述性。)
Dll 指定與驗證程式相關聯的 .dll 檔名 (.dll 檔案必須存在於 installation_folder\Templates\Distribution\Tools\platform 資料夾 (,其中 installation_folder 是您安裝 MDT 的資料夾,而 平臺 是 32 位版本的 x86 或 64 位版本的 x64 。)
名稱 指定驗證程式的名稱,其會顯示在適當的UDI精靈頁面和UDI Wizard Designer
類型 指定驗證程式類型,該驗證程式會向登錄因數註冊,並用來呼叫 .dll 檔案內的特定驗證程式
註解

無。

範例

無。

ValidatorLibrary

此元素會將一組 Validator 元素分組。

項目資訊

表 68 提供 ValidatorLibrary 元素的相關信息。

表格 68. ValidatorLibrary 元素資訊

屬性
發生次數 DesignerConfig 元素內的零個或一個 (如果 DLL 中沒有對應到此 UDI Wizard Designer 組態檔的自定義驗證程式,此元素是選擇性的。)
父元素 DesignerConfig
內容 驗證
項目屬性

這個項目沒有屬性。

註解

無。

範例

<DesignerConfig> + <TaskLibrary> - <ValidatorLibrary> +<Validator DLL=“” Description=“需要字段中的文字” Type=“Microsoft.Wizard.Validation.NonEmpty” Name=“NonEmpty”> +<Validator DLL=“” Description=“Doesn'。 t allow certain characters to be in a field” Type=“Microsoft.Wizard.Validation.InvalidChars” Name=“InvalidChars”> +<Validator DLL=“” Description=“Must follow a pre-defined pattern” Type=“Microsoft.Wizard.Validation.RegEx” Name=”NamedPattern“> +<Validator DLL=”“ Description=”Require the contents match a regular expression“ Type=”Microsoft.Wizard.Validation.RegEx“ Name=”RegEx“></ValidatorLibrary> + <DesignerMappings></DesignerConfig>

UDI 精靈 Designer 參考

控制項

用來建立自定義精靈頁面編輯器以用於UDI Wizard Designer的控件是WPF UserControl 實例。 表 69 列出可用來建立自定義精靈頁面編輯器的控制件。

表 69. 可用來建立自定義精靈頁面編輯器的控制件

控制項 說明
CollectionTControl 這個控件可用來編輯儲存在Page元素內Data元素中的數據。
FieldElementControl 此控件用來編輯欄位,此字段通常會連結至 .xaml 頁面上的 TextBox 控制件。
SetterControl 這個控件可用來修改 UDI Wizard 組態檔中 setter 元素的值。

CollectionTControl

此控制項提供許多編輯數據的功能。 瞭解如何使用此控件的最佳方式是查看範例,其中顯示如何在頁面的 Data 元素下編輯數據。 特別是,此範例會示範如何在此控件中新增、移除和編輯專案。

FieldElementControl

使用此控制項編輯欄位,此欄位通常會連結至 .xaml 頁面上的 TextBox 控制件。

範例

下列 .xaml 檔案摘錄說明如何使用 FieldElementControl ,在精靈頁面上使用子 TextBox 控件設定字段的預設值:

<Controls:FieldElementControl
Width="450"
Margin="0,5"
FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"
HeaderText="Location Combo Box"
InstructionText="Here you can configure the behavior of the location combo box."
HideValidationTab="True">

<TextBox Text="{Binding FieldData.DefaultValue,
 UpdateSourceTrigger=PropertyChanged,
 Mode=TwoWay}"/>
</Controls:FieldElementControl>
屬性
FieldData

此字串屬性包含將 FieldElementControl 連接到字段基礎 XML 的資訊。 線上至頁面編輯器介面的屬性。 下列 .xaml 檔案摘錄說明 FieldData 屬性的使用方式:

FieldData="{Binding DataContext.Location, ElementName=ControlRoot}"

在本摘錄中,頁面編輯器介面稱為 ControlRoot ,並且是在 ElementName 參數中指定。 系結會對 ControlRoot 頁面編輯器介面的 DataContext.Location 屬性執行。 DataContext 是指向 UDI Wizard 組態檔中 Page 元素的檢視模型。 Location 是檢視的屬性,會傳回可能的位置清單,並且是由 UDI Wizard 組態檔內 的 Data 元素所定義。 每個位置都是由UDI Wizard組態檔內的 DataItem 元素所定義。

HeaderText

此字串屬性可讓您指定 FieldElementControl 控件的標頭。 標頭會做為控件的標題,並格式化為緊接在控件上方顯示的粗體橙色文字。

InstructionText

此字串屬性可讓您指定 FieldElementControl 控件的信息文字。 一般而言,文字是用來提供字段的簡短描述,並說明設定欄位如何影響對應的精靈頁面。

HideEnableButton

此布林值屬性可讓您控制按鈕的可見性,該按鈕會在已啟用或停用的已解除鎖定 (啟用或停用 ) 之間變更狀態。 如果設定為:

  • True 是表示 按鈕不可見

  • False,按鈕會顯示 (這是預設值。)

HideDefaultTab

此布林值屬性可讓您控制包含用來設定預設值之控件的區段可見度。 雖然屬性參照索引標籤,但 FieldElementControl 上沒有索引卷標,而是可以隱藏的區段。 如果設定為:

  • True 是表示 區段不可見

  • False,區段會顯示 (這是預設值。)

HideBorder

此布林值屬性可讓您控制欄位控制元件周圍框線的可見度。 如果設定為:

  • True 是表示 看不到框線

  • False,框線會顯示 (這是預設值。)

HideImage

此布林值屬性可讓您控制 FieldImageSource 屬性所設定影像的可見性。 如果設定為:

  • True 是表示 看不到影像

  • False,影像會顯示 (這是預設值。)

HideValidationTab

此布林值屬性可讓您控制管理驗證程式清單的區段可見度。 雖然屬性參照索引標籤,但 FieldElementControl 上沒有索引卷標,而是可以隱藏的區段。 如果設定為:

  • True 是表示 區段不可見

  • False,區段會顯示 (這是預設值。)

HideSummaryTab

此布林值屬性可讓您控制設定欄位摘要 標題 區段的可見度。 來自欄位的 標題 和對應值會顯示在階段流程中的 SummaryPage 精靈頁面類型上。 雖然屬性參照索引標籤,但 FieldElementControl 上沒有索引卷標,而是可以隱藏的區段。 如果設定為:

  • True 是表示 區段不可見

  • False,區段會顯示 (這是預設值。)

HideTaskSequenceTab

此布林值屬性可讓您控制區段的可見性,您會在該區段中設定對應至欄位的工作順序變數。 雖然屬性參照索引標籤,但 FieldElementControl 上沒有索引卷標,而是可以隱藏的區段。 如果設定為:

  • True 是表示 區段不可見

  • False,區段會顯示 (這是預設值。)

SetterControl

使用此控件可修改 UDI Wizard 組態檔中 Setter 元素的值。 此控制項包含用來修改 setter 元素值的子控制件。

範例

下列 .xaml 檔案摘錄說明如何使用 SetterControl,使用子 TextBox 控件修改名為 KeyLocationSetter 的Setter 元素。

<Controls:SetterControl Margin="5"
        Width="450"
        HeaderText="Title text"
        SetterData="{Binding KeyLocationSetter}"
        InstructionText="What this means..."
        HorizontalAlignment="Left">

    <TextBox
                   Margin="0,3"
                   Text="{Binding SetterData.SetterValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
    />

</Controls:SetterControl>
屬性
SetterData

您必須將此系結至連線到 setter 之檢視或檢視模型的屬性。 這樣做類似於您系結至字段的方式,如 FieldElementControl 所述。

HeaderText

此屬性可讓您設定將出現在控件標頭中的文字。 將此屬性視為控件的標題;根據預設,它會顯示為粗體橙色文字。

InstructionText

將此屬性設定為您想要顯示在標頭下方的文字,通常是指示文字,告知自定義編輯器的使用者何時及為何要修改字段的行為。

介面

表 70 列出可用來建立自定義精靈頁面編輯器的介面。

表格 70. 可用來建立自定義精靈頁面編輯器的介面

介面 描述
IDataService 使用此介面將字段連接到UDI Wizard組態檔中的 Data 元素。
IMessageBoxService 此介面可讓您存取可用來顯示消息框的方法。

IDataService

此介面包含數個屬性和方法,但您只需要一個屬性。 該屬性是這裡唯一記載的屬性。

您可以使用相依性插入,在類別中使用如下的程式代碼來取得此介面的指標:

[Dependency]
public IDataService DataService { get; set; }
屬性

表 71 列出 IDataService 介面的屬性。

表格 71. IDataService 介面的屬性

介面 描述
CurrentPage 此屬性可讓您存取UDI Wizard組態檔中目前頁面內容下方的 XML 元素、屬性和值
CurrentPage
XElement CurrentPage { get; set; }

此屬性可讓您存取目前頁面的 XML。 您絕對不應該設定此屬性,但您可以隨意修改頁面的 XML。 範例頁面編輯器會顯示修改 XML 的範例。 您主要會在有自訂資料時使用此屬性。 針對 setter) (字段和屬性,您可以使用預先建置的控件來處理所有詳細數據。

IMessageBoxService

此介面可讓您存取可用來顯示消息框的方法。 您可能想知道為何需要介面來顯示消息框。 事實上,您不會這麼做:Microsoft 會在程式碼中搭配 使用此介面,因為它有助於撰寫設計工具頁面的自動化測試。

不過,使用這些方法確實提供一個實用的優點:對話框一律會將 「擁有者」設定為UDI精靈,這可確保對話框已正確地與主視窗分組。

您可以使用相依性插入,在類別中使用如下的程式代碼來取得此介面的指標:

[Dependency]
public IMessageBoxService MessageBoxes { get; set; }
方法

表 72 列出 IMessageBoxService 介面的方法。

表 72. IMessageBoxService 介面的方法

方法 描述
ShowMessageBox 這個多載方法可用來顯示包含下列成員的消息框:

- ShowMessageBox (字串訊息、字串 標題、MessageBoxImage 圖示)
- ShowMessageBox (字串訊息、字串 標題、MessageBoxButton 按鈕、MessageBoxImage 圖示)
- ShowMessageBox (例外狀況例外狀況)
ShowDialogWindow 使用這個方法來建立新的對話框。
ShowWizardWindow 使用此方法可在對話框內顯示自訂編輯器,其中包含 [下一步 ] 和 [上一頁 ] 按鈕以供流覽。
ShowMessageBox

這個方法會顯示消息框,此消息框是自定義精靈頁面編輯器的子系。 此成員已多載:表73包含成員清單和每個成員的簡短描述。 如需每個成員 (的完整資訊,包括語法、使用方式和範例) ,請參閱對應至每個成員的區段。

表格 73. ShowMessagBox 方法的多載成員

成員 說明
ShowMessageBox (字串訊息、字串 標題、MessageBoxImage 圖示) 顯示含有圖示和 [確定] 按鈕的消息框
ShowMessageBox (字串訊息、字串 標題、MessageBoxButton 按鈕、MessageBoxImage 圖示) 顯示包含圖示和不同按鈕組合的消息框
ShowMessageBox (例外狀況例外狀況) 顯示消息框,提供例外狀況的相關信息,並具有 [確定] 按鈕
ShowMessageBox (字串訊息、字串 標題、MessageBoxImage 圖示)
void ShowMessageBox(String message, String caption, MessageBoxImage icon);

這個方法會顯示含有 [ 確定 ] 按鈕的消息框。 請參閱表格 74。

表 74. ShowMessageBox (String 訊息、字串 標題、MessageBoxImage 圖示) 方法的參數

參數 描述
message 要顯示在消息框內容區域中的訊息
標題 要顯示在對話框標題列中的文字
圖示 要在消息框中顯示的圖示類型
ShowMessageBox (字串訊息、字串 標題、MessageBoxButton 按鈕、MessageBoxImage 圖示)
MessageBoxResult ShowMessageBox(string message, string caption, MessageBoxButton button, MessageBoxImage icon);

這個方法會顯示一個消息框,其中包含您要顯示的按鈕集,並報告您選取的按鈕。 請參閱表格 75。

表格 75. ShowMessageBox (字串訊息、字串 標題、MessageBoxButton 按鈕、MessageBoxImage 圖示) 方法的參數

參數 描述
message 要顯示在消息框內容區域中的訊息
標題 要顯示在對話框標題列中的文字
按鈕 要顯示的按鈕
圖示 要在消息框中顯示的圖示類型
ShowMessageBox (例外狀況例外狀況)
void ShowMessageBox(Exception exception);

這個方法會顯示一個消息框,以報告例外狀況的相關信息。 此消息框有單一 [確定] 按鈕。 請參閱表格 76。

表格 76. ShowMessageBox (例外狀況例外狀況) 方法的參數

參數 描述
例外 您想要回報的例外狀況 (對話框會使用 例外狀況。訊 息做為contents.)
ShowDialogWindow
void ShowDialogWindow(Type viewType, DialogInteraction dialogPayload);

這個方法會建立新的對話框,其內容是您在 viewType 參數中提供的文字。 UDI Designer 會建立此類型的新實例,並將它包裝在具有 [確定] 和 [取消] 按鈕的對話框中。

您可以使用 dialogPayload 參數將數據傳遞至控件。 SDK 目錄中的 SampleEditor 解決方案有如何使用這項功能的範例。

ShowWizardWindow
void ShowWizardWindow(Type viewType, DialogInteraction dialogPayload);

這個方法可讓您在對話框內顯示自訂編輯器,其中包含 [下一步 ] 和 [上一頁 ] 按鈕以進行流覽。 Microsoft 尚未提供如何使用此方法的範例。

UDI Wizard 組態檔架構參考

UDI Wizard 會取用此檔案,並由 UDI Wizard Designer 設定。 此檔案可用來設定:

  • UDI 精靈中顯示的精靈頁面

  • UDI 精靈中精靈頁面的順序

  • 每個精靈頁面上欄位的設定

  • UDI 精靈中的可用 StageGroups Designer

  • UDI Wizard 中每個部署精靈中的可用階段 Designer

    77 列出 UDI Wizard 組態檔中的專案及其描述。 Wizard 元素是此參考的根節點。

表格 77. UDI Wizard 組態檔中的元素及其描述

元素名稱 描述
資料 Page 元素內的個別 DataItem 元素分組,並以 Name 屬性命名。
DataItem Page 元素內的個別 Setter 元素分組。 您可以藉由在 DataItem 元素內包含一或多個 Data 元素來建立階層式數據。 每個 DataItem 元素都代表個別專案。 例如,可用磁碟驅動器的清單可能會有顯示名稱的 DataItem ,以及對應驅動器號的另一個 DataItem 元素。
Default 為父 FieldRadioGroup 元素中指定的欄位指定預設值。 預設值會設定為此元素括住的值。
Dll 指定要由 UDI Wizard 和 UDI Wizard Designer 載入和參考的 DLL。
Dll 將個別 DLL 元素分組。
錯誤 指定工作可以傳回的可能錯誤碼。 錯誤碼的值會由工作的 HRESULT 傳回,並由這個專案所擷取,以提供更具體的錯誤資訊。
ExitCode 指定工作的可能結束代碼。 結束代碼是工作預期的傳回碼。 為每個可能的結束代碼建立 ExitCode 專案。 否則,您可以在 Value 屬性中指定星號 (*) ,以處理其他 ExitCode 元素中未列出的傳回碼。
ExitCodes Task 元素或 Error 元素群組一組 ExitCodeError 元素。
Field 指定 Page 元素中用來提供 XML 自訂的控制項實例。 並非所有控制項都允許使用 XML 進行自定義,只允許使用 Field 元素的控件。
Fields Page 元素內的個別 Field 元素分組。
檔案 使用 Microsoft.Wizard.CopyFilesTask 工作類型指定檔案複製作業的來源和目的地。 您可以包含個別 的 File 元素,以便在單一工作中複製多個檔案。
Page 指定頁面的實例,並包含頁面的所有組態設定。
PageRef 指定 StageGroup階段內頁面實例的參考。
Pages 將個別 的Page 元素分組。
RadioGroup 指定 Field 元素內的單選按鈕群組。
StageGroup 指定一或多個階段的群組。
StageGroups 在 UDI Wizard 組態檔內將一組階段群組分組。
Setter 指定 Property 屬性中所命名之屬性 值的屬性 設定。
Stage 指定 StageGroup 內的階段,並包含一或多個 PageRef 元素。
Style 將設定 UDI Wizard 外觀和操作的個別 setter 元素分組,包括精靈頂端顯示的標題,以及 UDI Wizard 上顯示的橫幅影像。
工作 指定要在父 Page 元素中指定的頁面上執行的工作。
工作 Page 元素的一組工作分組。
驗證 指定父 Field 元素中指定之欄位 控制件的 驗證程式。
精靈 指定所有其他專案的根。

資料

此元素會將Page元素內的個別DataItem元素分組,並以Name屬性命名。

項目資訊

表 78 提供 Data 元素的相關信息。

表格 78. 數據元素資訊

屬性
發生次數 每個 Page 元素內的零個或多個 (此元素是選擇性的。)
父元素 PageDataItem
內容 DataItemSetter
項目屬性

表 79 列出 Data 元素的屬性,並提供每個屬性的描述。

表格 79. Data 元素的屬性和對應值

屬性 描述
Name 指定 Data 元素的名稱
註解

Name 屬性可讓程式代碼擷取一組特定的數據。

範例

無。

DataItem

此元素會將Page元素內的個別 Setter 元素分組。 您可以藉由在 DataItem 元素內包含一或多個 Data 元素來建立階層式數據。 每個 DataItem 元素都代表個別專案。 例如,可用磁碟驅動器的清單可能會有顯示名稱的 DataItem ,以及對應驅動器號的另一個 DataItem 元素。

項目資訊

表 80 提供 DataItem 元素的相關信息。

表格 80. DataItem 元素資訊

屬性
發生次數 每個 Data 元素內的零個或多個 (此元素是選擇性的。)
父元素 資料
內容 數據Setter
項目屬性

這個項目沒有屬性。

註解

無。

範例

無。

預設

這個專案會為父 FieldRadioGroup 元素中指定的欄位指定預設值。 預設值會設定為此專案括弧的值。

項目資訊

表 81 提供 Default 元素的相關信息。

表格 81. 預設元素資訊

屬性
發生次數 FieldRadioGroup 元素內的零個或多個 (此元素是選擇性的。)
父元素 FieldRadioGroup
內容 可以是任何格式正確的 XML 內容,但通常是標準文字
項目屬性

這個項目沒有屬性。

註解

無。

範例

在下列範例中, TimeZone 欄位的 預設值設為 “Pacific Standard Time”:

<Field Name="TimeZone" Enabled="true" VarName="OSDTimeZone" Summary="Time Zone:">
  <Default>Pacific Standard Time</Default>

Dll

這個專案會指定 UDI Wizard 和 UDI Wizard Designer 載入和參考的 DLL。

項目資訊

表 82 提供 DLL 元素的相關信息。

表 82. DLL 元素資訊

屬性
發生次數 DLL 專案內的一或多個
父元素 Dll
內容 不允許此元素的內容
項目屬性

表 83 列出 DLL 元素的屬性,並提供每個專案的描述。

表格 83. DLL 元素的屬性和對應值

屬性 描述
名稱 指定要參考之 UDI Wizard 和 UDI Wizard Designer 的 DLL 名稱
註解

無。

範例
<DLLs>
  <DLL Name="OSDRefreshWizard.dll" />
  <DLL Name="SharedPages.dll" />
</DLLs>

Dll

此元素會將個別 的 DLL 元素分組。

項目資訊

表 84 提供 DLL 元素的相關信息。

表格 84. DLL 項目資訊

屬性
發生次數 一個
父元素 Wizard
內容 Dll
項目屬性

這個項目沒有屬性。

註解

無。

範例
<DLLs>
   <DLL Name="OSDRefreshWizard.dll" />
   <DLL Name="SharedPages.dll" />
</DLLs>

錯誤

這個專案會指定工作可以傳回的可能錯誤碼。 工作 HRESULT 會傳回並擷取錯誤碼的值,以提供更具體的錯誤資訊。

項目資訊

表 85 提供 Error 元素的相關信息。

表 85. Error 元素資訊

屬性
發生次數 在每個 ExitCode 元素內有零個或多個 (此元素是選擇性的。)
父元素 ExitCodes
內容 任何格式正確的 XML 內容
項目屬性

表 86 列出 Error 元素的屬性,並提供每個屬性的描述。

表格 86. Error 元素資訊

屬性 描述
State 指定發生錯誤之工作的傳回狀態。 一般而言,這個屬性的值會設定為 Error。 此值會顯示在 UDI Wizard 中精靈頁面的 [ 狀態 ] 資料行中。
文字 指定工作遇到之錯誤條件的描述性文字。
類型 指定這個專案代表錯誤、警告或成功。 Type 中指定的值在 ExitCodes 元素內必須是唯一的。 以下是此元素的有效值:

- **0.**專案代表成功。
- 1. 專案代表警告。
- -1. 專案代表錯誤。
指定工作以數值傳回的程式代碼值。 指定星號的值 (*) 表示傳回碼的預設元素,這些傳回碼未列在其他 Error 元素中。
註解

無。

範例

無。

ExitCode

這個專案會指定工作的可能結束代碼。 結束代碼是工作預期的傳回碼。 為每個可能的結束代碼建立 ExitCode 專案。 否則,您可以在 Value 屬性中指定星號 (*) ,以處理其他 ExitCode 元素中未列出的傳回碼。

項目資訊

表 87 提供 ExitCode 元素的相關信息。

表格 87. ExitCode 元素資訊

屬性
發生次數 在每個 ExitCodes 元素內有零或多個 (此元素是選擇性的。)
父元素 ExitCodes
內容 至少一個 ExitCode 元素和零個或多個 Error 元素
項目屬性

表 88 列出 ExitCode 元素的屬性,並提供每個屬性的描述。

表格 88. ExitCode 元素的屬性和對應的值

屬性 說明
State 指定工作的傳回狀態。 此屬性的值會顯示在 UDI Wizard 中對應精靈頁面上的 [ 狀態 ] 資料行中。 您可以針對此屬性使用對工作有意義的任何值。 以下是用於此屬性的一般值:

-成功
-警告
-錯誤
文字 指定工作之存在程式代碼的描述性文字。
類型 指定這個專案代表錯誤、警告或成功。 類型中指定的值在 ExitCodes 元素內必須是唯一的。 以下是此元素的有效值:

- 0。 專案代表成功。
- 1. 專案代表警告。
- -1. 專案代表錯誤。
指定工作以數值傳回的程式代碼值。 指定星號的值 (*) 表示其他 ExitCode 元素中未列出之傳回碼的預設元素。
註解

無。

範例

無。

ExitCodes

此元素會將 TaskError 元素的一組 ExitCodeError 元素分組。

項目資訊

表 89 提供 ExitCodes 元素的 相關信息。

表 89. ExitCodes 元素資訊

屬性
發生次數 每個 Task 元素內一個
父元素 工作
內容 ErrorExitCode
項目屬性

這個項目沒有屬性。

註解

無。

範例

無。

欄位

此元素會指定 Page 元素中用來提供 XML 自訂的控制項實例。 並非所有控制項都允許使用 XML 進行自定義,只允許使用 Field 元素的控件。

項目資訊

表 90 提供 Field 元素的相關信息。

表格 90. Field 元素資訊

屬性
發生次數 在每個 Field 元素內有零個或多個 (此元素是選擇性的。)
父元素 Fields
內容 預設值、驗證程式
項目屬性

表 91 列出 Field 元素的屬性,並提供每個屬性的描述。

表 91. Field 元素的屬性和對應值

屬性 描述
Enabled 指定是否已針對使用者輸入啟用字段 (屬性可以設定為 True 或 False.)
名稱 指定欄位名稱
摘要 針對此欄位設定的值,指定 [ 摘要 精靈] 頁面上顯示的描述性文字
VarName 使用 父 Field 元素中的 欄位,指定讀取或設定的工作順序變數名稱
註解

此元素可以包含零個或多個 Default 元素,以及零個或多個 Validator 元素。

範例

無。

Fields

此元素會將Page元素內的個別 Field 元素分組。

項目資訊

表 92 提供 Fields 元素的相關信息。

表 92. Fields 元素資訊

屬性
發生次數 每個 Page 元素內的零個或多個 (此元素是選擇性的。)
父元素 Page
內容 FieldRadioGroup
項目屬性

這個項目沒有屬性。

註解

無。

範例

無。

檔案

此元素會使用 Microsoft.Wizard.CopyFilesTask 工作類型,指定檔案複製作業的來源和目的地。 您可以包含個別 的 File 元素,以便在單一工作中複製多個檔案。

項目資訊

表 93 提供 File 元素的相關信息。

表 93. File 元素資訊

屬性
發生次數 每個任務類型為 Microsoft.Wizard.CopyFilesTask 的一或多個任務
父元素 工作
內容
項目屬性

表 94 列出 File 元素的屬性,並提供每個屬性的描述。

表 94. File 元素的屬性和對應值

屬性 描述
Dest 針對 Source 屬性中指定的檔案,指定目的地資料夾的完整路徑或相對路徑。 允許環境變數做為路徑的一部分。
Source 指定 Microsoft.Wizard.CopyFilesTask 工作類型所複製來源檔案的完整或相對路徑。 這個屬性支援通配符,因此可以使用單一 File 元素來複製多個 檔案 。 允許環境變數作為路徑的一部分。
註解

無。

範例

無。

頁面

此元素會指定頁面的實例,並包含頁面的所有組態設定。

項目資訊

表 95 提供 Page 元素的相關信息。

表格 95. Page 元素資訊

屬性
發生次數 每個 Pages 元素內有一或多個
父元素 Pages
內容 數據欄位Setter工作
項目屬性

表 96 列出 Page 元素的屬性,並提供每個屬性的描述。

表 96. Page 元素的屬性和對應值

屬性 描述
DisplayName 指定 UDI Wizard Designer 中顯示之精靈頁面的使用者易記名稱。 這個名稱通常比 Name 屬性更具描述性。
名稱 指定 UDI Wizard Designer 中顯示的精靈頁面名稱。
類型 指定直接與 DLL 內特定精靈頁面相關聯的精靈頁面類型。
註解

無。

範例

無。

PageRef

這個專案會指定 StageGroup階段內頁面實例的參考。

項目資訊

表 97 提供 PageRef 元素的相關信息。

表格 97. PageRef 元素資訊

屬性
發生次數 Stage 元素內的一或多個
父元素 Stage
內容
項目屬性

表 98 列出 PageRef 元素的 屬性,並提供它的描述。

表格 98. PageRef 元素的屬性和對應值

屬性 描述
Page 指定 StageGroup階段內頁面的實例。 將此值設定為 Page 元素的Name屬性。
註解

無。

範例

無。

頁數

此元素會將個別 的Page 元素分組。

項目資訊

表 99 提供 Pages 元素的相關信息。

表格 99. Pages 元素資訊

屬性
發生次數 一個
父元素 精靈
內容 Page
項目屬性

這個項目沒有屬性。

註解

無。

範例
<Pages>
   + <Page Name="WelcomePage" DisplayName="Welcome" Type="Microsoft.SharedPages.WelcomePage">
   + <Page Name="ConfigScanPage" DisplayName="Deployment Readiness" Type="Microsoft.OSDRefresh.ConfigScanPage">
   + <Page Name="ConfigScanBareMetal" DisplayName="Deployment Readiness" Type="Microsoft.OSDRefresh.ConfigScanPage">
   + <Page Name="RebootPage" DisplayName="Reboot" Type="Microsoft.OSDRefresh.RebootPage">
   + <Page Name="WelcomePageReplace" DisplayName="Welcome" Type="Microsoft.SharedPages.WelcomePage">
   + <Page Name="VolumePage" DisplayName="Volume" Type="Microsoft.OSDRefresh.VolumePage">
   + <Page Name="UserRestorePage" DisplayName="Select Target" Type="Microsoft.OSDRefresh.UserStatePage">
   + <Page Name="ComputerPage" DisplayName="New Computer Details" Type="Microsoft.OSDRefresh.ComputerPage">
   + <Page Name="AdminAccounts" DisplayName="Administrator Password" Type="Microsoft.SharedPages.AdminAccountsPage">
   + <Page Name="UDAPage" DisplayName="User Device Affinity" Type="Microsoft.OSDRefresh.UDAPage">
   + <Page Name="LanguagePage" DisplayName="Language" Type="Microsoft.OSDRefresh.LanguagePage">
   + <Page Name="ApplicationPage" DisplayName="Install Programs" Type="Microsoft.OSDRefresh.ApplicationPage">
     <Page Name="SummaryPage" DisplayName="Summary" Type="Microsoft.Shared.SummaryPage" />
   + <Page Name="UserCapturePageOldPC" DisplayName="Select Target" Type="Microsoft.OSDRefresh.UserStatePage">
   + <Page Name="ProgressPage" DisplayName="Capture Data" Type="Microsoft.OSDRefresh.ProgressPage">
   + <Page Name="RebootAfterCapture" DisplayName="Reboot" Type="Microsoft.OSDRefresh.RebootPage">
</Pages>

RadioGroup

此元素會指定 Field 元素中 具有 的單選按鈕群組。

項目資訊

表 100 提供 RadioGroup 元素的相關信息。

表格 100。 RadioGroup 元素資訊

屬性
發生次數 Fields 元素內的零個或多個 (此元素是選擇性的。)
父元素 Fields
內容 Default
項目屬性

表 101 列出 RadioGroup 元素的屬性,並提供每個專案的描述。

表格 101。 RadioGroup 元素的屬性和對應值

屬性 描述
Locked 指定是否為使用者輸入啟用單選按鈕群組。 屬性可以設定為:

- True。 指定停用單選按鈕,且使用者無法選取群組中的單選按鈕。
- False。 指定已啟用單選按鈕,而且用戶可以在群組中選取單選按鈕。
名稱 指定無線電選項組的名稱。
註解

無。

範例

無。

StageGroup

此元素會指定部署階段群組。

項目資訊

表 102 提供 StageGroup 元素的相關信息。

表格 102。 StageGroup 元素資訊

屬性
發生次數 StageGroups 元素內的一或多個
父元素 StageGroups
內容 Stage
項目屬性

表 103 列出 StageGroup 元素的屬性和屬性的描述。

表格 103。 StageGroup 元素的屬性和對應值

屬性 描述
DisplayName 指定 UDI Wizard Designer 中顯示之階段群組的使用者易記名稱。 這個名稱通常比 Name 屬性更具描述性。
註解

無。

範例

無。

StageGroups

此元素會在 UDI Wizard 組態檔內將一組階段群組分組。

項目資訊

表 104 提供 StageGroups 元素的 相關信息。

表格 104。 StageGroups 元素資訊

屬性
發生次數 Wizard 元素內 的零個或一個
父元素 Wizard
內容 StageGroup
項目屬性

這個項目沒有屬性。

註解

無。

範例

無。

Setter

這個專案會指定 Property 屬性中所命名之屬性 值的屬性 設定。

項目資訊

表 105 提供 Setter 元素的相關信息。

表格 105。 Setter 元素資訊

屬性
發生次數 每個父元素內的零個或多個 (此元素是選擇性的。)
父元素 DataDataItemPageStyleTaskValidator
內容 Property 屬性中包含字串值
項目屬性

表 106 列出 Setter 元素的 屬性,並提供它的描述。

表格 106。 Setter 元素的屬性和對應值

屬性 描述
屬性 指定要設定的屬性名稱。 屬性名稱會設定為此屬性括弧的值。
註解

無。

範例

無。

階段

此元素會指定 StageGroup 內的 Stage ,並包含一或多個 PageRef 元素。

項目資訊

表 107 提供 Stage 元素的相關信息。

表格 107。 Stage 元素資訊

屬性
發生次數 StageGroup 元素內的一或多個
父元素 StageGroup
內容 PageRef
項目屬性

表 108 列出 Stage 元素的屬性,並提供每個專案的描述。

表格 108。 Stage 元素的屬性和對應值

屬性 描述
DisplayName 指定 UDI Wizard Designer 中顯示之精靈頁面的使用者易記名稱。 這個名稱通常比 Name 屬性更具描述性。
名稱 指定階段的名稱。 使用 /stage: name 命令行參數啟動 UDI Wizard 時,會使用這個專案的值。
註解

無。

範例

無。

Style

此元素會將設定 UDI Wizard 外觀和操作的個別 Setter 元素分組,包括精靈頂端顯示的標題,以及 UDI Wizard 上顯示的橫幅影像。

項目資訊

表格 109 提供 Style 元素的相關信息。

表格 109。 Style 元素資訊

屬性
發生次數 一個
父元素 Wizard
內容 Setter
項目屬性

這個項目沒有屬性。

註解

無。

範例
<Style>
  <Setter Property="bannerFilename">UDI_Wizard_Banner.bmp</Setter>
  <Setter Property="title">Operating System Deployment (OSD) Refresh Wizard</Setter>
</Style>

工作

此元素會指定要在父 Page 元素中指定的頁面上執行的工作。

項目資訊

表 110 提供 Task 元素的相關信息。

表格 110。 任務項目資訊

屬性
發生次數 Tasks 元素內 的一或多個
父元素 工作
內容 ExitCodesFileSetter
項目屬性

表 111 列出 Task 元素的屬性,並提供每個屬性的描述。

表 111。 Task 元素的屬性和對應值

屬性 描述
DependsOn 指定工作是否相依於另一個工作。 這個屬性的值會設定為另一個Task元素的Name屬性。 注意:無法使用 UDI Wizard Designer 來設定這個屬性。 不過,您可以直接修改 .xml 檔案,以手動方式將這個屬性新增至 Task 元素。
DisplayName 指定 UDI Wizard Designer 中顯示之工作的使用者易記名稱。 這個名稱通常比 Name 屬性更具描述性。
名稱 指定工作的名稱。 此名稱必須是唯一的。
類型 指定要執行之工作的工作類型,其定義於包含工作的 DLL 中。
註解

無。

範例

無。

工作

此元素會將 Page 元素的一組工作分組。

項目資訊

表 112 提供 Tasks 元素的 相關信息。

表格 112。 Tasks 元素資訊

屬性
發生次數 每個 Page 元素中有零或一個, (此元素是選擇性的。)
父元素 Page
內容 工作
項目屬性

表 113 列出 Tasks 元素的屬性,並提供每個屬性的描述。

表 113。 Tasks 元素的屬性和對應值

屬性 描述
NameTitle 指定出現在數據行頂端的 標題,其中包含適當精靈頁面中的工作名稱。
StatusTitle 指定出現在數據行頂端的 標題,其中包含適當精靈頁面中的工作狀態。
註解

無。

範例

無。

驗證

這個專案會指定父 Field 元素中指定之欄位 控件的 驗證程式。

項目資訊

表 114 提供 Validator 元素的相關信息。

表格 114. Validator 元素資訊

屬性
發生次數 Field 元素內的零個或一個
父元素 Field
內容 Setter
項目屬性

表 115 列出 Validator 元素的 屬性,並提供它的描述。

表 115。 Validator 元素的屬性和對應值

屬性 描述
類型 指定驗證程式的類型,其定義於包含驗證程式的 DLL 中
註解

無。

範例

無。

Wizard

此元素會指定所有其他專案的根。

項目資訊

表 116 提供 Wizard 元素的 相關信息。

表格 116. Wizard 元素資訊

屬性
發生次數 一個
父元素
內容 DLL頁面StageGroups樣式
項目屬性

這個項目沒有屬性。

註解

無。

範例
<Wizard>
   + <DLLs>
   + <Style>
   + <Pages>
   + <StageGroups>
</Wizard>