面向游戏开发人员的 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 文件本身中压缩、捆绑并压缩为单独的“cabinet 文件”,或作为单独的未压缩文件存储在安装介质上的其他位置。 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 功能只不过是可以一起安装的组件集合,因此游戏可以使用功能将游戏特定阶段所需的所有内容组合在一起。 例如,面向级别的游戏可以为每个级别定义一个功能,包括该级别所需的所有内容。 这将允许游戏从游戏本身内部一次安装一个级别的内容,而不是在初始安装期间安装所有级别的所有内容。
安装状态
每个组件或功能都有一个关联的安装状态,该状态确定组件或功能是否可用,如果可用,则确定安装组件或功能的文件的位置。 功能的可能安装状态包括:
-
缺席
-
此功能未安装,因此无法访问。
-
当地
-
此功能可用,并安装为从本地硬盘驱动器运行。
-
Source
-
此功能可用,并安装为从原始源媒体 (通常为 CD 或 DVD) 运行。
-
广告
-
此功能未安装,但可以使用 MsiConfigureFeature API 按需安装。 实际安装该功能后,可以将其安装到“本地”或“源”状态。
组件可以具有上述任何状态,“已播发”除外。如果组件是播发功能的一部分,则在安装该功能之前,该组件将显示为“Absent”。
按需安装
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。
- 有关游戏安装的最佳做法的信息,请参阅 游戏的安装和维护。