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