適用于遊戲開發人員的 Windows Installer
示範如何使用 Windows Installer 在使用者電腦上安裝遊戲。 Windows Installer 提供自訂使用者介面和修補的完整支援。
Microsoft Windows Installer 是用來在 Windows 電腦上安裝軟體的慣用 API。 雖然 Windows Installer 的許多功能都設計成支援在公司環境中部署商務應用程式,但 Windows Installer 也完全適合在使用者電腦上安裝遊戲。 使用 Windows Installer 進行遊戲安裝的主要優點如下:
- 可靠的卸載
- 視需要安裝內容的能力
- 完全自訂使用者介面的支援
- 有效率的修補
本文提供 Windows Installer 的概觀,特別以遊戲開發人員為目標。 如需本文中所述功能和 API 的詳細檔,請參閱Windows 平臺 SDK。
概觀
所有以 Windows Installer 為基礎的安裝程式都會使用稱為 MSI 檔案的安裝資料庫檔案來描述應用程式的安裝方式。 MSI 檔案包含要安裝哪些檔案、登錄機碼、桌面快捷方式、檔案關聯和其他應用程式元素的相關資訊。 要安裝的實際檔案可以在 MSI 檔案本身內壓縮、組合並壓縮成個別的「封包檔案」,或儲存在安裝媒體上的其他地方作為個別未壓縮的檔案。 MSI 檔案也可以參考外部實作的自訂動作,以允許 MSI 檔案原生不允許的動作。
MSI 檔案可以選擇性地包含使用者介面,以引導使用者完成安裝程式。 此 UI 適用于大部分的應用程式。 不過,它具有一般 Windows 應用程式的外觀和風格,許多遊戲開發人員偏好讓其設定應用程式維持遊戲本身的外觀和風格,以提供更一致的使用者體驗。 為了支援此完全自訂 UI 案例,安裝程式應用程式可以關閉 Windows Installer 的內建 UI,並處理整個使用者介面本身。 Windows Installer API 會公開回呼機制,以允許自訂安裝 UI 收到安裝進度的通知,以及磁片變更要求等重要事件。
Windows Installer 不是建立安裝程式的端對端解決方案。 它只是安裝程式可用來執行實際安裝檔案、登錄機碼、桌面快捷方式,以及應用程式其他元素的 API。 最新版本的所有主要商業安裝工具 (例如 InstallShield、WISE 和 Microsoft Visual Studio) 支援 Windows Installer。 這些工具提供方便的使用者介面來建立遊戲的設定,但它們依賴 Windows Installer API 來執行大部分的實際安裝。 這些工具也可以用來建置包含安裝套件的 MSI 資料庫,然後可以從自訂撰寫的安裝 UI 安裝。 除了協力廠商工具,Windows Installer API 提供以程式設計方式建立及操作 MSI 資料庫所需的所有功能,而Windows 平臺 SDK包含稱為 Orca 的裸機 MSI 資料庫編輯工具。
主要 Windows Installer 概念
以下是 Windows Installer 元件和功能。
單元
應用程式是由 GUID 元件識別碼所識別的一或多個元件所組成。 元件是不可部分完成的單位;完整安裝或完全未安裝。 元件可以包含單一檔案、多個檔案、登錄機碼、桌面快捷方式或其中一些組合。 資源 (檔案,因此元件內的) 必須是唯一的,該元件不能包含相同的資源。 一律不會明確安裝元件;它只會安裝為功能 (請參閱下列) 。
功能
功能是由 GUID 功能識別碼所識別的元件群組。 不同于元件,多個功能可能包含相同的元件。 如果已安裝這些功能,則會安裝多個功能之間共用的元件,而且只有在已卸載參考元件的所有功能時,才會移除。 在安裝產品時,可以自動安裝功能,或使用 MsiConfigureFeature API 手動完成。
雖然少數遊戲有多個可獨立安裝的「功能」,但功能的 Windows Installer 概念仍然有用。 由於 Windows Installer 功能不只是可一起安裝的元件集合,遊戲可以使用功能來將遊戲特定階段所需的所有內容分組在一起。 例如,層級導向遊戲可以為每個層級定義一項功能,其中包含該層級所需的所有內容。 這可讓遊戲一次從遊戲本身安裝一個層級的內容,而不是在初始安裝期間安裝所有層級的所有內容。
安裝狀態
每個元件或功能都有相關聯的安裝狀態,可判斷元件或功能是否可用,如果是的話,則安裝元件或功能的檔案。 功能的可能安裝狀態如下:
-
缺席
-
此功能未安裝,因此無法存取。
-
當地
-
此功能可供使用,並安裝以從本機硬碟執行。
-
源
-
此功能可供使用,並安裝以從原始來源媒體執行, (通常是 CD 或 DVD) 。
-
廣告
-
此功能未安裝,但可以使用 MsiConfigureFeature API 視需要安裝。 實際安裝此功能時,可以安裝到 [本機] 或 [來源] 狀態。
元件可以有上述任何狀態,但「已公告」除外。如果元件是已公告功能的一部分,則元件會顯示為「不存在」,直到安裝此功能為止。
隨選安裝
Windows Installer 可讓應用程式將功能標示為「已公告」,這表示尚未安裝此功能,但如有需要,可在執行時間安裝。 在執行時間安裝功能稱為「隨選安裝」。遊戲可以使用 [隨選安裝] 來大幅減少初始遊戲設定所需的時間,方法是延遲遊戲內容的安裝,直到執行時間需要為止。 在執行時間安裝內容所需的延遲,通常是在背景執行緒中執行隨選安裝而完全隱藏的,而使用者則不需使用遊戲。
自訂使用者介面
雖然 Windows Installer 提供預設的使用者介面,可引導使用者完成應用程式的安裝,但此介面看起來像是標準 Windows 應用程式的介面。 許多遊戲開發人員偏好其安裝 UI 的外觀和風格與遊戲本身相同,為使用者提供遊戲的感受。 為了支援此功能,Windows Installer 允許完全停用其內建使用者介面,讓開發人員能夠提供完全自訂的 UI。
自訂安裝程式會先使用 MsiSetInternalUI API 停用 Windows Installer 的內建使用者介面,以將 UI 層級設定為 INSTALLUILEVEL_NONE。 然後它會呼叫 MsiSetExternalUI API,以指定將在安裝程式期間呼叫的回呼函式,以在安裝期間通知安裝程式重要事件。
接著會呼叫 MsiInstallProduct API 來啟動實際的安裝程式。 此 API 接受參數字串,可讓呼叫端指定具名屬性的值。 這些屬性可以在安裝資料庫本身內使用,以自訂應用程式的安裝方式。 這些屬性可用來指定:
- 要安裝應用程式的目錄
- 例如,哪些功能要安裝在本機,以及要從 CD/DVD (執行的功能,以在最小安裝與完整安裝之間選擇)
- 是否應該為機器的所有使用者安裝應用程式,或只安裝目前使用者的應用程式
在安裝過程中,安裝程式會使用傳送至其回呼函式的通知訊息來判斷何時更新其進度指示器 UI、何時提示使用者插入下一個 CD,或何時通知使用者安裝程式中發生錯誤。
修補
Windows Installer 允許藉由套用修補程式檔案來修補已安裝的應用程式。 修補程式檔案包含修補程式要新增的新檔案、修補程式修改的檔案,以及要對安裝資料庫進行的變更清單。 為了節省空間,修補程式檔案實際上只會包含原始檔案版本與新版檔案之間的差異,而不是儲存修補程式變更之檔案的完整內容。
若要建立修補程式,您需要要從中升級修補程式的每個應用程式版本,以及新升級之應用程式版本的安裝映射。 安裝映射是由 MSI 資料庫和應用程式的所有實際資料檔案所組成。 為新版本的應用程式建立安裝映射的最佳方式,就是從舊版的應用程式複製安裝映射,然後進行任何變更,以將該複本更新至修補的版本。
一旦您擁有所有必要的安裝映射之後,您可以使用 Msimsp.exe 來建立修補程式,這是平臺 SDK 的一部分提供的修補程式建立工具。 此工具會要求每個安裝映射的位置,然後判斷如何有效率地代表後續版本之間的差異。 工具的輸出是延伸模組 MSP) 所識別的最終修補程式檔案 (。 若要以程式設計方式安裝修補程式,請呼叫 MsiApplyPatch API。 使用者也可以按兩下 Explorer 中的 MSP 檔案,手動安裝修補程式。
其他資源
- 如需 Windows Installer API 的詳細資訊,請參閱 Windows Installer。
- 如需遊戲安裝最佳做法的資訊,請參閱 遊戲的安裝和維護。