WiX 3让我抓狂——尝试创建桌面快捷方式

25

我有一个使用WiX 3进行安装的应用程序 - 目前大部分安装都工作正常,但尝试使桌面快捷方式工作似乎让我失去了理智...

我的应用程序已经安装并且我已经在“开始菜单”文件夹中创建了一个快捷方式 - 运行得很好。但是如何让桌面快捷方式能够工作呢?

<Product Id="*" Name="....." UpgradeCode="MY-GUID">
  <Package Id="*" InstallerVersion="200" Compressed="yes" />
    <Media Id="1" Cabinet="foobar.cab" EmbedCab="yes" />
    <Property Id="ALLUSERS">1</Property>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="FooBar"/>
      </Directory>
      <Directory Id="DesktopFolder"  SourceName="Desktop"/>
      <Directory Id="ProgramFilesFolder">
         <Directory Id="FoobarDir" Name="FOOBAR">
            <Directory Id="INSTALLLOCATION" Name="FooApp">
              <Component Id="MainFiles" Guid=".....">
                <File Id="FooMainApp" Source="FooMainApp.exe" />
              </Component>
            </Directory>
         </Directory>
      </Directory>
    </Directory>
    ....
    <!-- this shortcut here works just fine ... -->
    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="AppShortcut" Guid="...">
         <Shortcut Id="ApplicationStartMenuShortcut"
                   Name="FooBarApp" Description="..."
                   Target="[INSTALLLOCATION]FooMainApp.exe"
                   WorkingDirectory="INSTALLLOCATION"/>
      </Component>
    </DirectoryRef>
    <!-- but this shortcut here never seems to work .. ... -->
    <DirectoryRef Id="DesktopFolder">
       <Component Id="DesktopShortcut" Guid="....." >
          <Shortcut Id="DesktopAppShortcut"
                    Advertise="no"
                    Name="FooBarApp"  Description="...."
                    Target="[INSTALLLOCATION]FooMainApp.exe"
                    WorkingDirectory="INSTALLLOCATION"/>
       </Component>
    </DirectoryRef>

我一直收到的错误是:

ICE18: 组件 DesktopShortcut 的 KeyPath 是 Directory:DesktopFolder。Directory/Component 对必须在 CreateFolders 表中列出。
ICE38: 组件 DesktopShortcut 安装到用户配置文件中。它必须使用 HKCU 下的注册表键作为其 KeyPath,而不是文件。
ICE43: 组件 DesktopShortcut 具有非广告快捷方式。它应该使用 HKCU 下的注册表键作为其 KeyPath,而不是文件。

我不明白WiX 3 / Windows Installer到底在告诉我什么.... 有人能解释一下吗?

AppShortcutDesktopShortcut 这两个组件实际上都是“主”功能的一部分 - 我看不出有任何问题。我无法想象这里可能出了什么问题....

更新: 好的,我给我的桌面快捷方式添加了一些注册表键内容。

<Component Id="DesktopShortcut" Guid="BF3587B4-F52E-411E-8814-CFCBF8201C0D">
    <RegistryKey Root="HKCU" Key="Software\Foo Inc\FooBarApp\Installed" 
                 Action="createAndRemoveOnUninstall">
       <RegistryValue Name="DTSC" Value="1" Type="integer" KeyPath="yes"/>
    </RegistryKey>
    <Shortcut Id="DesktopShortcut" Directory="DesktopFolder"
              Name="FooBar" WorkingDirectory="INSTALLLOCATION"
              Icon="foobar.ico" 
              Target="[INSTALLOCATION]FooMainApp.exe"/>
</Component>

现在 ICE 消息已经消失了,但是当我尝试安装该应用程序时,我收到错误 1909 - 目标文件夹不存在或者您没有写入权限(或类似的情况)

更新2:上面提供的示例代码在 Win XP 上可以工作,但在 Win Server 2003 上一直失败 :-( 是否有更进一步的想法?


这个编程问题让我也疯了!而且还在继续疯狂中……因为我需要让它在Windows 7上运行。 - Mason Zhang
5个回答

20

这是我们现场生产代码的一个可行示例...

<Fragment>
    <Component Id="DesktopShortcut" Directory="APPLICATIONFOLDER" Guid="*">
        <RegistryValue Id="RegShortcutDesktop" Root="HKCU" 
                Key="SOFTWARE\ACME\settings" Name="DesktopSC" Value="1" 
                Type="integer" KeyPath="yes" />
        <Shortcut Id="desktopSC" Target="[APPLICATIONFOLDER]MyApp.exe"
                Directory="DesktopFolder" Name="My Application" 
                Icon="$(var.product).ico" IconIndex="0"
                WorkingDirectory="APPLICATIONFOLDER" Advertise="no"/>
    </Component>
</Fragment>

好的,感谢提供样例 - 在Win XP客户端上可以工作,但在Win Server 2003服务器上不行 :-( - marc_s
使用wix 3.6时,当我尝试将快捷方式目录属性设置为“DesktopFolder”时,会出现“error LGHT0094:在部分'Fragment:'中未解析符号'Directory:DesktopFolder'”。这是使用x64构建的情况。 - Epu
抱歉,我忘记在目录层次结构中使用<Directory Id="DesktopFolder"/>公开桌面文件夹。 - Epu
4
你真的开发了一个名为“我的应用”的应用程序吗? - Karsten
我不明白为什么Fragment很重要,但它确实很重要。我试图不定义Fragment,结果是在桌面上创建了快捷方式,但没有开始菜单的快捷方式(我只在Windows 10中测试过)。 - Eivind Gussiås Løkseth
显示剩余2条评论

11
这是基于@saschabeaumont的答案,但希望为我们这些WiX初学者提供一些额外的有用提示(对于每个人来说都是噩梦吗???)。
首先,创建一个包含快捷方式详细信息的片段:
<Fragment>
<Component Id="DesktopShortcut" Directory="INSTALLFOLDER" Guid="*">
    <RegistryValue Id="RegShortcutDesktop" 
            Root="HKCU" 
            Key="Software\Company\ApplicationName"
            Name="DesktopSC"
            Value="1" 
            Type="integer"
            KeyPath="yes" />

    <Shortcut Id="desktopSC" 
            Target="[INSTALLFOLDER]ApplicationName.exe"
            WorkingDirectory="INSTALLFOLDER"
            Icon="icon.ico"
            Directory="DesktopFolder" 
            Name="ApplicationName" 
            Advertise="no"/>
</Component>
</Fragment>

接下来,注意这个片段需要包含在Product element中,像这样:
<Feature Id="ProductFeature" Title="Your Application Title" Level="1">
    ...
    <ComponentRef Id="DesktopShortcut" />
</Feature>
ProductFeature 很可能包含其他片段,比如文件和程序菜单快捷方式片段。
同时,DesktopFolder 需要在 TARGETDIR 目录元素 中引用(该元素很可能包含其他文件夹,如您所需的 ProgramMenuFolder),像这样:
<Directory Id="TARGETDIR" Name="SourceDir">
    ...
    <Directory Id="DesktopFolder" Name="Desktop"/>
</Directory>

2
如果您希望快捷方式在所有用户配置文件中,那么将ALLUSERS设置为1,并在快捷方式的根目录中使用HKLM会导致错误ICE57。 - neslekkiM

7
每个 ICE 消息基本上都在抱怨同一件事情:安装快捷方式的组件应该有一个注册表条目作为它的keypath。要解决这个问题,可以在组件中添加类似于以下内容的代码:
<RegistryValue Root="HKCU" Key="Software\MyCompany\MyApplicationName" 
    Name="desktopShortcut" Type="integer" Value="1" KeyPath="yes"/>

同样适用于安装开始菜单快捷方式的组件。请查看相关的wix文档示例,了解如何创建快捷方式。

有趣的是:应用程序菜单快捷方式可以完美地工作,无需注册表键等其他操作。只是桌面快捷方式不会出现 :-( - marc_s
现在在Win XP上运行良好,但在Win Server 2003上一直出现错误1909 - 无法创建快捷方式链接。 - marc_s

2

我的目的是创建一个互联网快捷链接并放到桌面上。下面是适用于我的代码:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
    <Product Id="09F1B63D-FB03-43FD-A326-FD49F93D00C8" Name="TestProduct" Language="1033" Version="0.0.0.1" Manufacturer="WixEdit" UpgradeCode="6B2F9AB4-73A6-45CB-9EC4-590D1AAA6779">
        <Package Description="Test file in a Product" Comments="Simple test" InstallerVersion="200" Compressed="yes" />
        <Media Id="1" Cabinet="simple.cab" EmbedCab="yes" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Name="AAAA" Id="AAABBB">
                    <Component Id="AAAA">
                        <File Id="AAAA.EXE" Name="AAAA.exe" Source="U:\web\bin\x86\Release\AAAA.exe" />
                    </Component>
                </Directory>
            </Directory>
            <Directory Id="DesktopFolder">
                    <Component Id="StartMenuShortcuts" Guid="E8EDD7BC-9762-4C3D-8341-FAEC983D318A">
                        <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
                        <RegistryValue Root="HKCU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" />
                        <util:InternetShortcut Id="WebsiteShortcut" Name="AAAA Website" Target="http://www.AAAA.com" />
                    </Component>
            </Directory>
        </Directory>
        <Feature Id="DefaultFeature" Title="Main Feature" Level="1">
            <ComponentRef Id="StartMenuShortcuts" />
            <ComponentRef Id="AAAA" />
        </Feature>
        <UI />
    </Product>
</Wix>

注意:您需要在candlelight命令行中添加以下内容:-ext WiXUtilExtension


0

不确定2010年是否可用,但这是我在WiX 3.7中的做法:

<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>

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