演示如何使用 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 组件 ID 标识。 组件是原子单元;它要么完全安装,要么根本不安装。 组件可以包含单个文件、多个文件、注册表项、桌面快捷方式或其中的一些组合。 组件中的资源(文件等)必须是唯一的,组件不能包含同一个资源。 从不显式安装组件;它仅作为功能的一部分安装(请参阅以下内容)。
特征
功能是由 GUID 功能 ID 标识的一组组件。 与组件不同,多个功能可能包含相同的组件。 如果安装了这些功能中的任何一个,并且仅在卸载引用组件的所有功能时,才会安装在多个功能之间共享的组件。 可以在安装产品过程中自动安装功能,也可以使用 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。
- 有关游戏安装的最佳做法的信息,请参阅 游戏的安装和维护。