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

Adr*_*thy 21 windows-installer wix wix3.5

按照此处示例,我添加了一个启动我的应用程序的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>
Run Code Online (Sandbox Code Playgroud)

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

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

将每用户值用作每台计算机组件的KeyPath不是一个错误吗?

如果一台机器有两个管理员,而管理员#1安装该产品,而管理员#2尝试修复,那么Windows安装程序将看不到该注册表值并认为该快捷方式丢失并且它将安装一个副本,对吧?

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

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

错误LGHT0204:ICE43:组件cmpStartMenuShortcut具有未公布的快捷方式.它的[原文如此] KeyPath注册表项应属于HKCU.

错误LGHT0204:ICE57:组件'cmpStartMenuShortcut'具有每台用户和每台机器的数据以及每台机器的KeyPath.

我不明白为什么钥匙必须在HKCU下.

Tom*_*get 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>
Run Code Online (Sandbox Code Playgroud)

要将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>
Run Code Online (Sandbox Code Playgroud)

  • 您还没有真正回答为什么非广告的快捷方式无法将其"KeyPath"写入HKLM,或者为什么非广告的快捷方式需要**注册表**`KeyPath`,但广告的快捷方式不需要. (6认同)
  • 谢谢.这个解决方案似乎对我有用.当我开始沿着WiX路走时,我不知道我将不得不学习XSLT. (2认同)