使用WiX创建桌面快捷方式

69

我该如何在Wix安装项目中创建一个桌面快捷方式?


这是我对微软“技术”近来的感受。这条评论距今已经将近三年了,所以很明显现在的技术水平并没有得到改善。 - Ian Ray
6个回答

94

这个快捷方式是一个非广告的快捷方式。记得将组件放在您的功能标签中。

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="DesktopFolder" Name="Desktop">
        <Component Id="ApplicationShortcutDesktop" Guid="*">
            <Shortcut Id="ApplicationDesktopShortcut"
                Name="Text under your icon"
                Description="Comment field in your shortcut"
                Target="[MYAPPDIRPROPERTY]MyApp.exe"
                WorkingDirectory="MYAPPDIRPROPERTY"/>
            <RemoveFolder Id="DesktopFolder" On="uninstall"/>
            <RegistryValue
                Root="HKCU"
                Key="Software\MyCompany\MyApplicationName"
                Name="installed"
                Type="integer"
                Value="1"
                KeyPath="yes"/>
        </Component>
    </Directory>

    <Directory Id="ProgramFilesFolder" Name="PFiles">
        <Directory Id="MyCompany" Name="MyCompany">
            <Directory Id="MYAPPDIRPROPERTY" Name="MyAppName">
                <!-- main installation files -->
            </Directory>
        </Directory>
    </Directory>
</Directory>

13
不要发布硬编码 GUID。使用 Guid="*" 代替自动生成 GUID,��者使用 {PUT-GUID-HERE}。 - Stein Åsmul
6
注册表值是用来做什么的? - BatteryBackupUnit
2
@BatteryBackupUnit 快捷方式不能作为组件的键路径,因此需要使用注册表值来实现该功能。WiX文档中也使用了相同的技术:http://wixtoolset.org/documentation/manual/v3/howtos/files_and_registry/create_start_menu_shortcut.html - vangelion
3
将文件ID放入目标属性中比使用"[MYAPPDIRPROPERTY]MyApp.exe"更好。 - Hossein Shahdoost
7
我需要在特征标签下添加以下内容: <ComponentRef Id="ApplicationShortcutDesktop" />。 - uriel
显示剩余8条评论

32

我认为我的方法更容易,您不需要创建注册表键:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="DesktopFolder" SourceName="Desktop" />
  <Directory Id="MergeRedirectFolder">
    <Component Id="MyExeComponent" Guid="{PUT-GUID-HERE}">
      <File Id="MyExeFile" Source="$(var.ExeSourcePath)" KeyPath="yes">
        <Shortcut
          Id="DesktopShortcut"
          Directory="DesktopFolder"
          Name="$(var.ShortcutName)"
          WorkingDirectory="MergeRedirectFolder" />
      </File>
    </Component>
  </Directory>
</Directory>

2
根据文档中关于注册表键的说明:“这是必需的,因为当为当前用户安装非广告快捷方式时,快捷方式无法作为组件的KeyPath。” - blins
1
文件组件本身就是关键路径,快捷方式“继承”文件属性。不过,当您尝试在众多文件中跟踪桌面快捷方式时,这种方式可能会有点令人困惑。我认为这取决于用户偏好,是紧凑还是可追溯性? - Chris Watts
在大多数情况下,您不希望将快捷方式的工作目录设置为应用程序安装到的目录。 - Edward Brey
此答案展示了如何根据Windows Installer文档创建有效的快捷方式。Wix将构建一个包含Shortcut记录的软件包(MSI),其中Directory_字段引用特殊的DesktopFolder文件夹,而Target字段则携带值[#<ID-of-MyExeFile>]。我唯一看到的缺点是文件和快捷方式都属于单个组件,因此不能单独安装它们。显然,安装快捷方式而不安装目标文件是没有意义的,但现在您也无法选择“在桌面上放置快捷方式”选项了。 - Armen Michaeli
我错过的另一个缺点是,由于关键路径是快捷方式链接到的文件,因此安装的修复工作不总是按照用户的预期行为--如果文件存在,则不会修复(即:安装)缺失的快捷方式,因为组件被认为已存在(文件已放置在原处)。 - Armen Michaeli

19

感谢提供示例。在 WIX 3.8 中仍然会出现以下错误:“Error 3 ICE43:组件...具有非广告快捷方式。它应该使用 HKCU 下的注册表键作为其 KeyPath,而不是文件。”

因此,在带有功能的文件中,我采用了以下方法:

   <Component Id="cmp79F6D61F01DD1060F418A05609A6DA70" 
              Directory="dirBin" Guid="*">
      <File Id="fil34B100315EFE9D878B5C2227CD1454E1" KeyPath="yes"
            Source="$(var.SourceDir)\FARMS.exe" >
        <Shortcut Id="DesktopShortcut"
                  Directory="DesktopFolder"
                  Name="FARMS $(var.FarmsVersion)"
                  Description="Local Land Services desktop application"
                  WorkingDirectory="INSTALLFOLDER"
                  Icon="FARMS.exe"
                  IconIndex="0"
                  Advertise="yes" >
           <Icon Id="FARMS.exe" SourceFile="$(var.SourceDir)\FARMS.exe" />
        </Shortcut>
        </File>
    </Component>

在产品定义文件中提到了桌面文件夹:

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="DesktopFolder" Name="Desktop" />

      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="FARMS" >
        </Directory>
      </Directory>
    </Directory>
  </Fragment>

9
这篇文档看起来更容易理解。
首先,你需要指定你的DesktopFolder。
   <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="DesktopFolder" Name="Desktop"/>

那么,您应该为想要创建快捷方式的文件创建一个“快捷方式”组件。

  <Component Id="PutYourComponentIdHere" Directory="FileDirectory" Guid="*">
    <File Id="NotYourComponentId" KeyPath="yes" Source="..\YourFileSource\YourExecutable.exe">
      <Shortcut Id="desktopServer" Directory="DesktopFolder" Name="YourShourtcutName" WorkingDirectory='WhereShouldYourShortcutPoint' Advertise="yes"/>
    </File>
  </Component>

这对我很有效。我需要放置图标,但这很容易。希望它能正常工作。


6

经过很多努力,我用了这种方式:

<Product ...>
    <Feature Id="ProductFeature" Title="SetupProject" Level="1">
      ...
      ...
      <ComponentRef Id="cmpDesktopShortcut" />
    </Feature>

    <Component Id="cmpDesktopShortcut" Guid="PUT-GUID-HERE" Directory="DesktopFolder" >
        <Shortcut Id="MyDesktopShortcut" 
                  Name="Setup Project" 
                  Description="Opens the program." 
                  Directory="DesktopFolder" 
                  Target="[INSTALLFOLDER]App.exe"
                  WorkingDirectory="INSTALLFOLDER"/>
        <RegistryValue Root="HKCU" Key="Software\My Company\Sample Application" Name="installed" Type="integer" Value="1" KeyPath="yes" />
    </Component>
</Product>

0

我认为在多用户机器上,使用“当前用户”(HKCU)注册表键作为关键路径会导致问题。因为该注册表键仅为当前用户创建,当不同的用户登录时,安装的自动修复就会启动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接