WiX 3 сводит меня с ума - пытается создать ярлык на рабочем столе

У меня есть приложение, которое устанавливается с 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: KeyPath для компонента: DesktopShortcut - это каталог: DesktopFolder. Пара Каталог / Компонент должна быть указана в таблице CreateFolders.
ICE38: Компонент DesktopShortcut устанавливается в профиль пользователя. Он должен использовать ключ реестра в HKCU в качестве пути ключа, а не файл.
ICE43: Компонент DesktopShortcut имеет не рекламируемые ярлыки. В качестве пути ключа следует использовать ключ реестра HKCU, а не файл.

Я не понимаю, что мне тут пытается сказать WiX 3 / Windows Installer .... кто-нибудь ??

Оба компонента, AppShortcut и DesktopShortcut, на самом деле являются частью «основной» функции - я не вижу здесь никаких проблем. Я не могу понять, что, черт возьми, здесь может быть не так ...

Обновление: хорошо, поэтому я добавил несколько ключей реестра в ярлык на рабочем столе.

<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 :-( Есть какие-то дополнительные идеи ??


person marc_s    schedule 19.06.2010    source источник
comment
эта проблема тоже свела меня с ума! и все еще сходит с ума ... потому что мне нужно заставить его работать в Windows 7   -  person Mason Zhang    schedule 05.12.2011


Ответы (5)


Вот рабочий пример из нашего живого производственного кода ...

<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>
person saschabeaumont    schedule 20.06.2010
comment
ОК, танки для образца - у меня работает на клиентах Win XP, но не на серверах Win Server 2003 :-( - person marc_s; 21.06.2010
comment
хм, это кажется довольно странным. Предлагаете сравнение 32 / 64бит? Профили в роуминге или локальные? Он работает на консоли, но не на удаленном рабочем столе и т. Д.? - person saschabeaumont; 22.06.2010
comment
Мой сервер Win2003 - это 32-разрядная версия на виртуальной машине VMWare. То же самое для моей тестовой машины WinXP (тоже ВМ). В любом случае - поскольку мне он нужен пока только для XP, это решает мою проблему - спасибо! - person marc_s; 23.06.2010
comment
В wix 3.6, когда я пытаюсь установить для атрибута ярлыка Directory значение DesktopFolder, я получаю сообщение об ошибке LGHT0094: неразрешенная ссылка на символ «Directory: DesktopFolder» в разделе «Фрагмент:». Это при сборке x64. - person Epu; 06.06.2012
comment
NM, я забыл открыть папку рабочего стола в иерархии каталогов с помощью ‹Directory Id = DesktopFolder /› - person Epu; 06.06.2012
comment
Вы действительно делаете приложение My application? - person Karsten; 26.09.2012
comment
Я не понимаю, почему Фрагмент важен, но это так. Я попытался не определять фрагмент, и это привело к появлению ярлыка на рабочем столе, но не ярлыку меню запуска (я тестировал только в Windows 10). - person Eivind Gussiås Løkseth; 08.01.2016

Это основано на ответе @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 directory element (который, скорее всего, будет содержать другие папки, например ProgramMenuFolder по вашему запросу), например:

<Directory Id="TARGETDIR" Name="SourceDir">
    ...
    <Directory Id="DesktopFolder" Name="Desktop"/>
</Directory>
person noelicus    schedule 14.10.2013
comment
Что делать, если вы хотите, чтобы ярлык находился в профиле «Все пользователи»? Если установить ALLUSERS = 1 и использовать HKLM для root в ярлыке, произойдет сбой. ICE57 - person neslekkiM; 12.06.2014

Каждое из этих сообщений ICE в основном жалуются на то же самое: компонент, устанавливающий ярлык, должен иметь запись реестра в качестве своего пути к ключу < / а>. Чтобы исправить это, добавьте в компонент что-то вроде этого:

<RegistryValue Root="HKCU" Key="Software\MyCompany\MyApplicationName" 
    Name="desktopShortcut" Type="integer" Value="1" KeyPath="yes"/>

То же самое касается компонента, устанавливающего ярлык меню «Пуск». Взгляните на соответствующий образец документации wix о создании ярлыка.

person Wim Coenen    schedule 19.06.2010
comment
Забавно то, что ярлык меню приложения работает безупречно - никаких ключей реестра не требуется. Просто ярлык на рабочем столе не появится :-( - person marc_s; 20.06.2010
comment
Теперь он отлично работает на Win XP, но продолжает давать сбои с ошибкой 1909 - не удается создать ссылку быстрого доступа ....... на Win Server 2003 - person marc_s; 21.06.2010

Моя цель - создать ссылку для быстрого доступа к Интернету и поместить ее на рабочий стол. Вот код, который мне подходит:

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

ПРИМЕЧАНИЕ. Вам необходимо добавить в командные строки свеча и свет следующее: -ext WiXUtilExtension

person Mason Zhang    schedule 05.12.2011

Не уверен, было ли это доступно еще в 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>
person Sean Hall    schedule 07.08.2013