(WiX)每台机器安装的程序文件快捷方式

时间:2013-06-21 23:42:17

标签: wix windows-installer wix3.5

example here之后,我添加了启动我的应用程序的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 ='advanced'和@ 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之下。

2 个答案:

答案 0 :(得分:12)

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

或者,当目标未被广告(卸载产品)时,将卸载正在安装或广告的目标的快捷方式。例如,WiX安装了一个名为WiX Documentation的wix.chm快捷方式。广告快捷方式的快捷方式元素可以成为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>

答案 1 :(得分:0)

我建议做的只是按照你的说法制作文件夹,而不是直接在它下面放置快捷方式。而是在包含文件的组件下创建一个快捷方式元素。您可以使用“目录”属性指定要显示快捷方式的位置。