Ярлык (не рекламируемый) не создается установщиком Wix?

Я создал простой установщик MSI с Wix 3.11. Он включает EXE и ярлык, но ярлык никогда не появляется на рабочем столе. Я создаю MSI без ошибок, в остальном он устанавливается нормально, и в файле журнала MSI ошибок нет. Я просматривал MSI с Orca и вижу ярлык и каталог на рабочем столе в их таблицах. Мысли? Я попытался установить для ALLUSERS значение 1, но безрезультатно. Вот мой файл wxs:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" Name="Imaginary Product" Language="1033" 
    Version="1.2.3.4" Manufacturer="Company" UpgradeCode="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx">

    <Package Id="*" InstallerVersion='300' Compressed='yes'/>

    <Media Id="1" Cabinet="ImaginaryProduct.cab" EmbedCab="yes"/>

    <?if $(sys.BUILDARCH)="x64" ?>
      <?define Win64 = "yes" ?>
      <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
    <?else ?>
      <?define Win64 = "no" ?>
      <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
    <?endif ?>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="DesktopFolder" SourceName="Desktop">
        <Component Id="MainExecutableShortcut" Guid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}">
          <Shortcut Id="ImaginaryUIEXEShortcut" Name="Imaginary UI" Description="Runs Imaginary UI" Target="ImaginaryUI.exe" WorkingDirectory="ProductProgramFilesFolder"/>
          <RemoveFolder Id="RemoveDesktopFolder" Directory="DesktopFolder" On="uninstall"/>
          <RegistryValue Root="HKCU" Key="Software\Microsoft\ImaginaryUI" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
        </Component>
      </Directory>

      <Directory Id="$(var.PlatformProgramFilesFolder)">
        <Directory Id="ManufacturerProgramFilesFolder" Name="Company">
          <Directory Id="ProductProgramFilesFolder" Name="Imaginary Product">
            <Component Id="MainExecutable" Guid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}">
              <File Id="ImaginaryUIEXE" Name="ImaginaryUI.exe" Vital="yes" Source=".\bin\$(var.Configuration)\ImaginaryUI.exe" KeyPath="yes"/>
            </Component>
          </Directory>
        </Directory>
      </Directory>
    </Directory>


    <Feature Id='MainApplication' Level='1'>
      <ComponentRef Id="MainExecutable" Primary="yes"/>
      <ComponentRef Id="MainExecutableShortcut" Primary="yes"/>
    </Feature>

  </Product>
</Wix>

Обновление: когда ярлык не указывает и значок, я вижу это в журнале установщика:

Action start 16:27:50: CreateShortcuts.
MSI (s) (08:34) [16:27:50:522]: Note: 1: 2205 2:  3: Icon 
MSI (s) (08:34) [16:27:50:522]: Note: 1: 2228 2:  3: Icon 4: SELECT `Name`, `Data` FROM `Icon` 
MSI (s) (08:34) [16:27:50:522]: Note: 1: 2205 2:  3: MsiShortcutProperty 
MSI (s) (08:34) [16:27:50:523]: Note: 1: 2205 2:  3: MsiShortcutProperty 
Action ended 16:27:50: CreateShortcuts. Return value 1.

Когда я указываю один, я вижу еще меньше:

MSI (s) (14:D0) [16:34:59:527]: Doing action: CreateShortcuts
MSI (s) (14:D0) [16:34:59:527]: Note: 1: 2205 2:  3: ActionText 
Action start 16:34:59: CreateShortcuts.
MSI (s) (14:D0) [16:34:59:528]: Note: 1: 2205 2:  3: MsiShortcutProperty 
MSI (s) (14:D0) [16:34:59:528]: Note: 1: 2205 2:  3: MsiShortcutProperty 
Action ended 16:34:59: CreateShortcuts. Return value 1.

Итак, никаких признаков отказа. Иконка просто уходит в эфир.


person Dan    schedule 25.01.2018    source источник


Ответы (2)


Я не уверен, что это ваша проблема, но чтобы использовать папку рабочего стола, вы просто определяете ее как

<Directory Id="DesktopFolder"/>

Я думаю, вы действительно помещаете ярлык в «C: \ Desktop \» (при условии, что TARGETDIR - это C :). Все Свойства системной папки должно быть определено точно так же.

Также удалите это из определений компонентов

<RemoveFolder Id="RemoveDesktopFolder" Directory="DesktopFolder" On="uninstall"/>

Вы не хотите удалять папку рабочего стола, это не то, что вы создали при установке, и это не то, что вам принадлежит. Кроме того, RemoveFolder ничего не будет делать, если в этой папке есть что-то еще, и в основном у всех есть как минимум корзина в папке рабочего стола, поэтому она никогда ничего не будет делать.

Я не уверен, почему RemoveFolder используется в других определениях ярлыков, таких как стартовое меню. Это может быть связано с тем, как работает установщик Windows, когда он неявно удаляет папку только при наличии компонентов, содержащих файлы.

person Brian Sutherland    schedule 26.01.2018
comment
Спасибо за советы, но без кубиков. Я удалил свойство Directory SourceName, а также элемент RemoveFolder, но ярлык по-прежнему не создается. Я поискал на установочном диске соответствующий файл * .lnk и ничего не нашел. - person Dan; 27.01.2018
comment
Попробуйте использовать Target="[#ImaginaryUIEXE]" там, где вы используете значение идентификатора файла. Я не уверен, что вы правильно выполняете ProgramFilesFolder ... это должно быть просто автоматически установлено, и он выберет правильную папку на основе вашей конфигурации при создании и использовании x86 или x64 в качестве платформы, но это может быть отдельной проблемой, или он может работать так, как вы его настроили. - person Brian Sutherland; 29.01.2018

Я почти уверен, что Target должен быть идентификатором, а не именем файла. Так что измени

Target="ImaginaryUI.exe"

to

Target="[#ImaginaryUIEXE]" 
person john ktejik    schedule 06.07.2021