gpt4 book ai didi

wix - 为什么 WiX 不允许我在 HKLM 中设置非广告快捷方式的 KeyPath?

转载 作者:行者123 更新时间:2023-12-04 13:53:15 25 4
gpt4 key购买 nike

我正在尝试为每台机器的应用程序生成一个安装程序。这是我的组件:

<Component Id="ProductComponent" Directory="InstallFolder" Guid="{MY_GUID}">
<File Id="ProductComponent" Source="$(var.MyApp.TargetPath)">
<Shortcut Id="StartMenuShortcut"
Name="MyApp"
Description="App Description"
Directory="MenuFolder"
WorkingDirectory="InstallFolder"
Icon="icon.ico" />
</File>
<RemoveFolder Id="RemoveMenuFolder" Directory="MenuFolder" On="uninstall" />
<RegistryValue Root="HKLM" Key="Software\Microsoft\MyApp" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
</Component>

WiX 吐出以下内容:

Error ICE43: Component ProductComponent has non-advertised shortcuts. It's KeyPath registry key should fall under HKCU.



我不明白为什么我打算成为每台机器的组件需要每用户的 KeyPath。在其他用户执行卸载过程中不会留下此 key 吗?或者它的缺失导致维修期间重复?

似乎是这样,将其更改为 HKCU 后,我仍然收到以下信息:

Warning ICE57: Component 'ProductComponent' has both per-user and per-machine data with an HKCU Registry KeyPath.



因此,除了将所有内容安装到用户配置文件之外,我真的不知道如何避免任何这些错误/警告。

最佳答案

严格来说,抛出这些错误的不是 WIX,而是 Microsoft Windows Installer Internal Consistency Evaluators . WIX 在构建 MSI 期间运行所有 ICE,如果有任何失败,则会引发错误。总的来说,这是一件好事,因为它在构建阶段消除了 MSI 数据库中的许多潜在错误。

您可以制作 ICE43通过使用 HKMU 作为注册表根,错误消失。 HKMU 是 WIX 用来将值 -1 放在 Registry Table 的 Root 列中的特殊常量。的 Windows 安装程序数据库。这会导致 Windows Installer 将注册表项放在每台机器安装的 HKLM 和每用户安装的 HKCU 中。

迄今为止,我没有找到修复 ICE57 的方法。在不将快捷方式移动到其自己的组件并使用 HKCU 作为注册表根的情况下,每台机器安装中的非广告快捷方式的错误。但是,如果用户 A 安装产品而用户 B 删除产品,则以这种方式编写的安装程序数据库可能会在用户 A 的注册表配置单元中留下注册表项。

我早就觉得ICE57在每台机器安装中检查非广告快捷方式时会产生误报错误。这很难 100% 确定地证明,因为我们无法访问 ICE57 背后的逻辑。

在这种情况下,我倾向于为 EXE 和快捷方式使用单独的组件。在快捷方式中的注册表值中使用注册表根中的HKMU,并在WIX工具设置中取消ICE57:

<Component Id="ProductComponent" Directory="InstallFolder" Guid="{MY_GUID}">
<File Id="ProductComponent" Source="$(var.MyApp.TargetPath)" KeyPath="yes">
</Component>

<Component Id="ShortcutComponent" Directory="MenuFolder" Guid="{MY_GUID}">
<Shortcut Id="StartMenuShortcut"
Name="MyApp"
Description="App Description"
Target="[#ProductComponent]"
WorkingDirectory="InstallFolder"
Icon="icon.ico" />
<RemoveFolder Id="RemoveMenuFolder" On="uninstall" />
<RegistryValue Root="HKMU" <!-- Resolves to HKLM on per machine installs -->
Key="Software\Microsoft\MyApp"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>

看上面的例子,目录 ShortcutComponentMenuFolder通常源自 ProgramMenuFolder .

Windows 安装程序将重定向 ProgramMenuFolder到每台机器安装中的所有用户菜单文件夹,或每用户安装中的当前用户菜单文件夹。见 Installation Context有关如何根据安装是按机器还是按用户重定向文件夹的详细信息。

类似地,注册表根 HKMU 应该在每台机器安装中重定向到 HKLM,在每用户安装中重定向到 HKCU。

在每台机器和每用户方案中,快捷方式和注册表设置的安装位置是一致的。尽管有明显的一致性,您仍然会收到 ICE57 错误。这意味着 ICE57 在这种情况下会产生误报。

更多讨论在 Wix create non advertised shortcut for all users / per machineWhy do we get an ICE57 error for non advertised shortcuts in per machine installations?

关于wix - 为什么 WiX 不允许我在 HKLM 中设置非广告快捷方式的 KeyPath?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37231186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com