Подтвердить что ты не робот

(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, который является местом для каждого пользователя.

Нельзя ли использовать значение для каждого пользователя в качестве ключевого элемента для компонента для каждой машины?

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

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

error LGHT0204: ICE38: компонент cmpStartMenuShortcut устанавливает в профиль пользователя. Это [sic] Keypath раздел реестра должен подпадать под HKCU.

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

error LGHT0204: ICE57: Компонент "cmpStartMenuShortcut" имеет как данные для каждого пользователя, так и данные для каждой машины с помощью KeyPath для каждой машины.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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