22

按照此处的示例,我向启动我的应用程序的ProgramMenuFolder添加了一个快捷方式。(我的代码实际上更简单,因为我不需要额外的文件夹。)

<DirectoryRef Id='ProgramMenuFolder'>
  <Component Id='cmpStartMenuShortcut'
             Guid='MY GUID HERE'>
    <Shortcut Id='StartMenuShortcut'
              Name='$(var.ProductName)'
              Icon='MainIcon.ico'
              Description='$(var.ProductName)'
              Target='[ClientDir]myapp.exe'
              WorkingDirectory='ClientDir'/>
    <RegistryValue Action='write' Type='integer' Root='HKCU'
                   Key='Software\Company\Product Name'
                   Name='installed' Value='1' KeyPath='yes'/>
  </Component>
</DirectoryRef>

由于我的安装是每台机器(ALLUSERS=1、Package/@InstallPrivileges='elevated' 和 @InstallScope='perMachine'),ProgramMenuFolder 是机器上所有用户的文件夹。

我的问题与注册表值有关。我的理解是,只需为包含快捷方式的组件提供 KeyPath 即可。该示例使用 HKCU,它是每个用户的位置。

将每个用户的值用作每个机器组件的 KeyPath 不是错误的吗?

如果一台机器有两个管理员,管理员 #1 安装产品,管理员 #2 尝试修复,那么 Windows Installer 将看不到注册表值并认为缺少快捷方式,它会安装一个副本,对吗?

所以我尝试将 RegistryValue/@Root 更改为 HKLM,但随后 WiX 抱怨:

错误 LGHT0204:ICE38:组件 cmpStartMenuShortcut 安装到用户配置文件。[原文如此] KeyPath 注册表项必须属于 HKCU。

错误 LGHT0204:ICE43:组件 cmpStartMenuShortcut 具有非广告快捷方式。[原文如此] KeyPath 注册表项应属于 HKCU。

错误 LGHT0204:ICE57:组件“cmpStartMenuShortcut”具有每个用户和每个机器的数据以及每个机器的 KeyPath。

我不明白为什么密钥必须在 HKCU 之下。

4

2 回答 2

14

这种快捷方式适用于现在或在调用它时可能未安装的目标。它创建经典的 .lnk 快捷方式文件。它对于指向您的安装程序不负责的目标的快捷方式很有用,但可能对您的产品用户使用(例如 cmd.exe)很有用。

或者,当目标未宣传(产品已卸载)时,您正在安装或宣传的目标的快捷方式将被卸载。例如,WiX 安装了一个名为 WiX 文档的 wix.chm 快捷方式。广告快捷方式的 Shortcut 元素可以成为 File 元素的子元素。

这是一个手写的例子:

<Component Id="ProductComponent">
   <File Source="$(var.ConsoleApplication1.TargetPath)" KeyPath="yes">
     <Shortcut Id="$(var.ConsoleApplication1.TargetName)Shortcut" 
               Name="$(var.ConsoleApplication1.TargetName)" 
               Advertise="yes"
               Description="Starts $(var.ConsoleApplication1.TargetName)"
               Directory="ProgramMenuFolder" />
   </File>
</Component>

要将 Shortcut 元素插入到 heat 的输出中,请将其传递给 XSL 转换的路径。片段:

<xsl:template match="wix:File[contains(@Source,'\myapp.exe')]">
  <xsl:copy-of select="." />
  <Shortcut Id='StartMenuShortcut'
          Advertise="yes"
          Name='$(var.ProductName)'
          Icon='MainIcon.ico'
          Description='$(var.ProductName)'
          WorkingDirectory='ClientDir'/>
</xsl:template>
于 2013-06-24T19:11:11.683 回答
0

我建议做的只是按照您所说的创建文件夹,而不是将快捷方式直接放在它下面。而是在保存文件的组件下创建一个快捷方式元素。您可以使用 Directory 属性来指定您希望快捷方式出现的位置。

于 2013-06-23T12:10:17.003 回答