【问题标题】:Shortcut Target is set to keyPath instead of parent file? (WIX documentation is wrong)快捷方式目标设置为 keyPath 而不是父文件? (WIX 文档是错误的)
【发布时间】:2012-11-30 12:38:56
【问题描述】:

WIX documentatino on Shortcut element 说关于目标属性:

The value will be defaulted to the parent File when nested under a File element.

但是代码

<Component Guid="MY_GUID" Id="MyAppComponent">
  <File Source="SomeDll.dll" Name="SomeDll.dll" Id="SomeDll.dll" KeyPath="yes" />
  <File Source="MyDll.exe" Name="MyDll.exe" Id="MyDll.exe" />
    <Shortcut Id="MyApp.Shortcut" Directory="ApplicationProgramMenuDir" WorkingDirectory="INSTALLDIR" Name="MyApp" Icon="ProgramIcon.ico" Advertise="yes" />
  </File>
</Component>

没有按预期工作 - 指向 dll 文件的快捷方式并运行它会显示 Windwos 错误消息,它无法启动具有 dll 扩展名的文件。

要解决这个问题,我们需要做的唯一不同是:为 exe 文件而不是 dll 设置 KeyPath="yes" 属性:

<Component Guid="MY_GUID" Id="MyAppComponent">
  <File Source="SomeDll.dll" Name="SomeDll.dll" Id="SomeDll.dll"/>
  <File Source="MyDll.exe" Name="MyDll.exe" Id="MyDll.exe" KeyPath="yes" />
    <Shortcut Id="MyApp.Shortcut" Directory="ApplicationProgramMenuDir" WorkingDirectory="INSTALLDIR" Name="MyApp" Icon="ProgramIcon.ico" Advertise="yes" />
  </File>
</Component>

所以 WIX 文档包含错误? Target 不是设置为父 File 元素,而是设置为祖先的 Component 的 KeyPath?

还是我的错误和我的代码有问题?

【问题讨论】:

  • 不确定 WiX 方面,所以只是指出这一点:您的组件的结构不符合 msdn.microsoft.com/en-us/library/windows/desktop/aa368269.aspx #3 的建议“为每个 .exe、.dll 和 .ocx 定义一个新组件文件。将这些文件指定为其组件的关键路径文件。"
  • 这是一个很好的建议。我已经有几次想要实现这个但还没有时间。虽然这不是一项要求 - 仅建议确保在执行安装程序次要升级或补丁逻辑时正确更新所有文件。我进行了重大升级,因此将所有文件夹文件放在单个组件中还没有造成任何问题。

标签: wix shortcut


【解决方案1】:

尝试像这样添加&lt;RegistryValue&gt;标签:

<Component Guid="MY_GUID" Id="MyAppComponent">
    <File Source="SomeDll.dll" Name="SomeDll.dll" Id="SomeDll.dll"/>
    <File Source="MyDll.exe" Name="MyDll.exe" Id="MyDll.exe" KeyPath="yes" />
        <Shortcut Id="MyApp.Shortcut" Directory="ApplicationProgramMenuDir" WorkingDirectory="INSTALLDIR" Name="MyApp" Icon="ProgramIcon.ico" Advertise="yes" />
    </File>
    <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]\setup" Name="Shortcut" Type="integer" Value="1" KeyPath="yes" />
</Component>

如果您的InstallScopeperUser,则使用HKCU

如果您的InstallScopeperMachine,则使用HKLM

【讨论】:

  • 我不明白 RegistryValue 在已经工作的示例中应该如何提供帮助?您刚刚复制了我的工作代码示例。而且我什至不明白这个 RegistryValue 的用途是什么??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多