面向游戏开发人员的 Windows 游戏资源管理器
Windows Vista 通过包括游戏资源管理器来提高 Windows 上游戏的用户体验。 游戏资源管理器在 Windows Vista“开始”菜单中作为“游戏”文件夹公开,并提供用于访问游戏的中心位置。
从 DirectX SDK 2009 年 3 月版本开始,新的游戏定义文件 (GDF) 架构用于支持 Windows 7、游戏提供程序和 RSS 源和 IGameExplorer2 中的功能。 IGameExplorer2 是 Windows 7 上的一个新界面,简化了将游戏与游戏资源管理器集成的过程。
本文概述了使用新的 GDF 架构在 Windows Vista 和 Windows 7 上向游戏资源管理器和家长控制注册游戏的过程。
注意
游戏资源管理器在 Windows 10 版本 1803 及更高版本中不可用。
内容:
- 先决条件
- 与安装程序 集成
- 集成过程
- 游戏资源管理器任务
- 集成到 InstallScript
- 集成到 MSI 包
-
调试提示
- 使用示例代码 测试
- 确保游戏已正确删除
- 请务必使用 Authenticode 进行签名
- 确保家长控制
- 验证任务是否为正确的类型
- 验证 GDF 二进制文件中的数据
- 摘要
先决条件
在将游戏集成到游戏资源管理器之前,必须创建游戏定义文件(GDF)。 GDF 是一个 XML 文件,其中包含描述游戏的元数据。 在 DirectX SDK 2009 年 3 月版本中,游戏提供程序、RSS 源和游戏任务的一个部分已添加到 GDF 架构。 若要使用本文中的说明,必须使用此新的 GDF 格式来创建 GDF 文件。
Microsoft提供了一个工具,用于在 DirectX SDK、游戏定义文件编辑器中创作 GDF,以便更轻松地完成此创建过程。 此工具还有助于创建 GDF 的本地化版本。
编写和本地化 GDF 后,它必须封装在二进制文件(可执行文件或 DLL)的资源部分中,以及游戏的缩略图和图标。 GDF 包含与游戏关联的所有元数据,包括游戏的评分。 Windows 家长控制使用游戏的分级,允许家长控制对游戏的访问。 包含 GDF 的二进制文件必须使用有效的验证码证书进行数字签名;否则,游戏资源管理器和家长控制系统将忽略游戏的分级,因为分级信息在未经认证的情况下无法信任。 有关使用 Authenticode 对代码进行签名的更多详细信息,请参阅 游戏开发人员的验证码签名。
与安装程序集成
为了简化游戏资源管理器集成,GameUXInstallHelper 示例提供了一个可在 Windows XP、Windows Vista 和 Windows 7 上调用的常见 API。 它设计用于 InstallShield 和 Wise 安装系统的脚本,以及 MSI 自定义作和自定义安装工具。 检测作系统是在此示例 DLL 中处理的,因此调用方无需担心客户端是运行 Windows XP、Windows Vista 还是 Windows 7。
此 DLL 导出的函数如下:
-
GameExplorerInstallW
-
向游戏资源管理器注册游戏,给定 GDF 二进制文件的路径、安装游戏的文件夹的完整路径以及安装范围。
-
GameExplorerInstallA
-
向游戏资源管理器注册游戏;GameExplorerInstallW的 ANSI 版本。
-
GameExplorerUninstallW
-
从游戏资源管理器的注册中删除游戏,给定 GDF 二进制文件的路径。
-
GameExplorerUninstallA
-
从游戏资源管理器注册中删除游戏;GameExplorerUninstallW的 ANSI 版本。
-
GameExplorerSetMSIProperties
-
为 MSI 延迟自定义安装的作配置 CustomActionData 属性。 本文稍后将详细介绍此函数的用法。
-
GameExplorerInstallUsingMSI
-
将游戏添加到游戏资源管理器;用于 MSI 自定义作安装。
-
GameExplorerUninstallUsingMSI
-
从游戏资源管理器中删除游戏;用于 MSI 自定义作安装。
GameUXInstallHelper.h 标头中进一步解释了这些函数。
集成过程
将 GDF 和相关文件添加到二进制资源后,就可以将游戏与游戏资源管理器集成。 使用 GameUXInstallHelper 将简化集成过程。 若要向游戏资源管理器注册游戏,请使用 GDF 二进制文件的路径、安装范围的文件夹的完整路径调用 GameExplorerInstall。 若要删除游戏的注册,请使用 GDF 二进制文件的路径调用 GameExplorerUninstall。
请注意,删除过程仅删除一个唯一的安装。 如果游戏已安装多次,则必须为每个唯一安装重复此过程。
游戏资源管理器任务
游戏资源管理器任务将显示在游戏资源管理器中项的上下文菜单中。 任务分为播放任务和支持任务。 播放任务将游戏启动到特定模式,而支持任务用于任何其他目的,包括链接到网站。
在 Windows Vista 中,任务只是位于特定文件夹中的快捷方式。 播放任务和支持任务存储在具有相应名称 PlayTasks 和 SupportTasks 的文件夹中。 GameUXInstallHelper 可以从 GDF 二进制文件读取游戏的任务信息,并自动创建所有快捷方式。
在 Windows 7 中,不需要任务快捷方式,因为游戏资源管理器直接从 GDF 二进制文件获取所有任务信息。
集成到 InstallScript 中
通过使用 GameUXInstallHelper 示例,可以轻松地从 InstallShield 的 InstallScript 调用游戏资源管理器 API。 与 InstallShield 集成所需的步骤如下所示:
在 InstallShield 编辑器中打开 InstallScript 项目。
将 GameUXInstallHelper.dll 添加到要安装到目标目录的项目。
若要向 InstallScript 项目添加 GameUXInstallHelper.dll:
在 安装设计器 选项卡上,单击左侧导航窗格中 应用程序数据。
单击 文件和文件夹 并在 源计算机的文件夹 中浏览,在源计算机的文件 中找到 GameUXInstallerHelper.dll。
GameUXInstallerHelper.dll 的默认位置为 DirectX SDK root\Samples\C++\Misc\Bin\x86。
在 目标计算机的文件夹下,单击 应用程序目标文件夹。
将 GameUXInstallerHelper.dll 从 源计算机的文件 拖动到 目标计算机的文件。
在 InstallScript 资源管理器中,单击调用 DLL 函数的 InstallScript 文件(通常是 setup.rul)。
将以下 InstallScript 粘贴到文件中:
typedef GUID begin LONG Data1; SHORT Data2; SHORT Data3; CHAR Data4(8); end; prototype LONG GameUXInstallHelper.GameExplorerInstallW(WSTRING, WSTRING, NUMBER); prototype LONG GameUXInstallHelper.GameExplorerUninstallW(WSTRING); function OnMoved() WSTRING gdfbin[256]; WSTRING path[256]; NUMBER scope; begin if !MAINTENANCE then UseDLL( TARGETDIR ^ "GameUXInstallHelper.dll" ); UseDLL( WINSYSDIR ^ "OLE32.dll" ); path = TARGETDIR; gdfbin = TARGETDIR ^ "bin\\ExampleGame.exe"; // TODO: Change this to point to binary containing the GDF if ALLUSERS == 1 then scope = 3; else scope = 2; endif; GameUXInstallHelper.GameExplorerInstallW( gdfbin, path, scope); UnUseDLL( TARGETDIR ^ "GameUXInstallHelper.dll" ); UnUseDLL( WINSYSDIR ^ "OLE32.dll" ); endif; end; function OnMoving() WSTRING gdfbin[256]; begin if MAINTENANCE && UNINST != "" then UseDLL( TARGETDIR ^ "GameUXInstallHelper.dll" ); UseDLL( WINSYSDIR ^ "OLE32.dll" ); gdfbin = path ^ "bin\\ExampleGame.exe"; // TODO: Change this to point to binary containing the GDF GameUXInstallHelper.GameExplorerUninstallW(gdfbin); UnUseDLL( TARGETDIR ^ "GameUXInstallHelper.dll" ); UnUseDLL( WINSYSDIR ^ "OLE32.dll" ); endif; end;
集成到 MSI 包中
下面是使用 MSI 自定义作调用游戏资源管理器 API 所需的步骤的高级说明:
- 将属性添加到名为“RelativePathToGDF”的 MSI 属性表中,其中包含 GDF 二进制文件的相对路径。
- 在 CostFinalize作后,在即时自定义作中 SetMSIGameExplorerProperties 调用 GameUXInstallHelper DLL 函数,以设置其他自定义作的相应 MSI 属性。
- 安装后,在 InstallFiles作后触发延迟的自定义作,该作调用 GameUXInstallHelper DLL 函数 AddToGameExplorerUsingMSI。 如果安装适用于所有用户,则自定义作必须设置标志 msidbCustomActionTypeNoImpersonate;否则,它不得设置此标志。 因此,定义了两个几乎相同的自定义作:GameUXAddAsAdmin 和 GameUXAddAsCurUser。
- 删除安装后,在调用 GameUXInstallHelper DLL 函数的 RemoveFiles作之前触发延迟的自定义作,RemoveFromGameExplorerUsingMSI。 如果安装适用于所有用户,则自定义作必须设置标志 msidbCustomActionTypeNoImpersonate;否则,它不得设置此标志。 因此,定义了两个几乎相同的自定义作:GameUXRemoveAsAdmin 和 GameUXRemoveAsCurUser。
- 定义回滚自定义作来处理用户取消安装或删除这些自定义作之一后的情况。 这会导致其他 4 个自定义作:GameUXRollBackAddAsAdmin、GameUXRollBackAddAsCurUser、GameUXRollBackRemoveAsAdmin 和 GameUXRollBackRemoveAsCurUser。
以下说明详细介绍了此过程,其中描述了可以使用 MSI 编辑器(如平台 SDK 中找到的 Orca 编辑器)完成的过程。 某些 MSI 编辑器具有向导,可简化其中一些配置步骤。
配置 MSI 包以与游戏资源管理器
在 Orca 中打开 MSI 包。
将下表中显示的行添加到 MSI 包中的 Binary 表中。
名字 数据 GAMEUX DLL\GameUXInstallHelper.dll 的文件路径 注意
此文件将嵌入 MSI 包中,因此每次重新编译 GameUXInstallHelper.dll时都必须执行此步骤。
将下表中显示的行添加到 MSI 包中的 CustomAction 表中。
行动 类型 源 目标 GameUXSetMSIProperties msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue = 65 GAMEUX SetMSIGameExplorerProperties GameUXAddAsAdmin msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 GAMEUX AddToGameExplorerUsingMSI GameUXAddAsCurUser msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript = 1089 GAMEUX AddToGameExplorerUsingMSI GameUXRollBackAddAsAdmin msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 GAMEUX RemoveFromGameExplorerUsingMSI GameUXRollBackAddAsCurUser msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript = 1345 GAMEUX RemoveFromGameExplorerUsingMSI GameUXRemoveAsAdmin msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3137 GAMEUX RemoveFromGameExplorerUsingMSI GameUXRemoveAsCurUser msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeInScript = 1089 GAMEUX RemoveFromGameExplorerUsingMSI GameUXRollBackRemoveAsAdmin msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript + msidbCustomActionTypeNoImpersonate = 3393 GAMEUX AddToGameExplorerUsingMSI GameUXRollBackRemoveAsCurUser msidbCustomActionTypeDll + msidbCustomActionTypeBinaryData + msidbCustomActionTypeContinue + msidbCustomActionTypeRollback + msidbCustomActionTypeInScript = 1345 GAMEUX AddToGameExplorerUsingMSI 将下表中针对 Action、Condition 和 Sequence 显示的值添加到 MSI 包中的 InstallExecuteSequence 表中。
行动 条件 序列 笔记 GameUXSetMSIProperties 1015 序列号将作置于 CostFinalize 之后。 GameUXAddAsAdmin 未安装且 ALLUSERS 4003 此自定义作仅在所有用户的全新安装过程中发生。 序列号将作放在 InstallFiles 之后和回滚之后。 GameUXAddAsCurUser 未安装且未安装 ALLUSERS 4004 此自定义作仅在当前用户的全新安装过程中发生。 序列号将作放在 InstallFiles 之后和回滚之后。 GameUXRollBackAddAsAdmin 未安装且 ALLUSERS 4001 仅当取消所有用户的全新安装时,才会执行此自定义作。 序列号将作放在 InstallFiles 之后和添加自定义作之前。 GameUXRollBackAddAsCurUser 未安装且未安装 ALLUSERS 4002 仅当当前用户的全新安装被取消时,才会执行此自定义作。 序列号将作放在 InstallFiles 之后和添加自定义作之前。 GameUXRemoveAsAdmin REMOVE~=“ALL”和 ALLUSERS 3452 此自定义作仅在删除所有用户期间发生。 序列号将作直接置于 RemoveFiles 和回滚之后。 GameUXRemoveAsCurUser REMOVE~=“ALL”,而不是 ALLUSERS 3453 此自定义作仅在删除当前用户期间发生。 序列号将作直接置于 RemoveFiles 和回滚之后。 GameUXRollBackRemoveAsAdmin REMOVE~=“ALL”和 ALLUSERS 3450 仅当取消所有用户的删除时,才会执行此自定义作。 序列号将作直接放在 RemoveFiles 和 Remove 自定义作之前。 GameUXRollBackRemoveAsCurUser REMOVE~=“ALL”,而不是 ALLUSERS 3451 仅当取消当前用户的删除时,才会执行此自定义作。 序列号将作直接放在 RemoveFiles 和 Remove 自定义作之前。 将下表中显示的行添加到 MSI 包中的 Property 表。
财产 价值 RelativePathToGDF 包含 GDF 的二进制文件的相对文件路径\n 注意
路径指定的位置相对于安装路径指定的位置。 例如,bin\GDF.dll。
保存 MSI 包。
有关 MSI 包和 Windows Installer 的更多详细信息,请参阅 Windows Installer。
调试提示
以下是在调用游戏资源管理器 API 时帮助调试问题的一些提示:
使用示例代码进行测试
生成 GameUXInstallHelper 示例解决方案将创建 GameUXInstallHelper.dll 和 GDFInstall.exe。 GDFInstall.exe 是使用 GameUXInstallHelper.dll的示例应用程序。 如果想要从游戏资源管理器安装或删除 GDF 二进制文件,则运行 GDFInstall.exe 将提示你。 可以通过将 GDF 二进制文件作为第一个命令行参数传入以 GDFInstall.exe来测试它。
如果没有 GDF 二进制文件或安装失败,请尝试在 DirectX SDK 中使用示例 GDF。 GDFExampleBinary 示例位于 DirectX SDK 中,只是仅包含 GDF 文件的 DLL。 源中还包括其 GDFMaker 项目。 可以使用 GDFInstall.exe生成和测试它。 还可以将其 XML 与你的 XML 进行比较,以准确查明问题所在位置。
确保游戏已正确删除
如果游戏已在游戏资源管理器中安装,则后续调用 IGameExplorer::AddGame 将返回E_FAIL,因此请确保在测试之前未安装游戏。 如果仅为当前用户安装 GDF,然后尝试为所有用户安装 GDF,则这也适用。 必须先从当前用户中删除游戏,然后才能成功 IGameExplorer::AddGame。
如果运行 GDFInstall.exe 枚举,示例应用程序将进入另一种模式,它将枚举所有已安装的游戏资源管理器游戏并提示删除它们。 还可以在 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\GameUX 中浏览和搜索注册表,以确保未为系统上的其他用户安装游戏。 但是,请勿出于任何其他目的更改这些注册表设置,因为它们不能保证在作系统的未来版本中保持兼容。
请务必使用 Authenticode 进行签名
如果已提供分级,但在游戏资源管理器中未看到该分级,请确保已使用 Authenticode 对包含分级的可执行文件或 DLL 文件进行签名。 游戏资源管理器忽略未签名文件中的分级信息。 有关 Authenticode 的详细信息,请参阅 游戏开发人员的验证码签名。
确保家长控制可用
确保在 Windows Vista 版本上测试家长控制,该版本提供家长控制:家庭基本版、家庭高级版或终极版。 Windows Vista Business 和 Windows Vista Enterprise 不提供家长控制,但是,如果你在 Windows Vista Ultimate 上进行测试,并且测试计算机已加入域,则必须更改组策略设置以使家长控制可见。 为此,请参阅游戏资源管理器 入门。
验证任务的类型是否正确
如果指定了未显示在游戏资源管理器中的支持任务,请验证它们是否都是 Web 链接。 任何其他快捷任务都必须创建为播放任务。 本文前面介绍了 游戏资源管理器任务中的任务。
验证 GDF 二进制文件中的数据
GDFTrace.exe 是在 DirectX SDK 中找到的工具。 可以在 GDF 二进制文件上运行 GDFTrace.exe,它将为每个受支持的语言输出二进制文件中包含的所有 GDF 元数据,以便快速验证。 它还显示有关缺失或过时信息的任何警告。
总结
Windows Vista 中的游戏资源管理器提供了一种简单、可自定义的方式来向 Windows Vista 用户展示你的游戏,但它也要求你在安装过程中将游戏注册到系统。 GameUXInstallHelper 示例极大地简化了开发人员的此过程。