示範如何使用 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。 使用者也可以在檔案總管中按兩下 MSP 檔案,手動安裝修補程式。
其他資源
- 如需 Windows Installer API 的詳細資訊,請參閱 Windows Installer。
- 如需遊戲安裝最佳做法的資訊,請參閱 遊戲的安裝和維護。