(WiX) Ярлыки программных файлов для установки на машину

Следуя приведенному здесь примеру, я добавил ярлык в 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>

Поскольку моя установка выполняется для каждой машины (ALLUSERS=1, Package/@InstallPrivileges='повышенный уровень' и @InstallScope='perMachine'), ProgramMenuFolder - это папка для всех пользователей на этой машине.

Мой вопрос связан со значением реестра. Насколько я понимаю, нужно просто предоставить KeyPath для компонента, который содержит ярлык. Образец использует HKCU, который является местоположением для пользователя.

Не является ли ошибкой использование значения на пользователя в качестве KeyPath для компонента на машину?

Если на машине два администратора, и администратор №1 устанавливает продукт, а администратор №2 пытается выполнить восстановление, то установщик Windows не увидит значение реестра и не подумает, что ярлык отсутствует, и установит дубликат, верно?

Поэтому я попытался изменить RegistryValue/@Root на HKLM, но потом WiX жалуется:

ошибка LGHT0204: ICE38: Компонент cmpStartMenuShortcut устанавливается в профиль пользователя. Это [sic] ключ реестра KeyPath должен попадать под HKCU.

ошибка LGHT0204: ICE43: Компонент cmpStartMenuShortcut имеет не объявленные ярлыки. Это [sic] ключ реестра KeyPath должен попадать под HKCU.

ошибка LGHT0204: ICE57: компонент 'cmpStartMenuShortcut' содержит данные как для пользователя, так и для компьютера с KeyPath для каждого компьютера.

Я не понимаю, почему ключ должен быть под HKCU.

2 ответа

Решение

Этот стиль ярлыка предназначен для цели, которая может быть не установлена ​​ни сейчас, ни во время ее вызова. Создает классический ярлык.lnk. Это полезно для ярлыков для целей, за которые не отвечает ваш установщик, но может быть полезно для пользователей вашего продукта (например, cmd.exe).

Кроме того, ярлык для цели, которую вы устанавливаете, или реклама будут удалены, если цель не объявлена ​​(продукт удален). Например, WiX устанавливает ярлык для wix.chm под названием WiX Documentation. Элемент Shortcut для объявленного ярлыка может быть дочерним по отношению к элементу 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>

Чтобы вставить элемент Shortcut в вывод тепла, передайте ему путь к XSL-преобразованию. Snippet:

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

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

Другие вопросы по тегам