按照此处的示例,我向启动我的应用程序的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='elevated' 和 @InstallScope='perMachine'),ProgramMenuFolder 是机器上所有用户的文件夹。
我的问题与注册表值有关。我的理解是,只需为包含快捷方式的组件提供 KeyPath 即可。该示例使用 HKCU,它是每个用户的位置。
将每个用户的值用作每个机器组件的 KeyPath 不是错误的吗?
如果一台机器有两个管理员,管理员 #1 安装产品,管理员 #2 尝试修复,那么 Windows Installer 将看不到注册表值并认为缺少快捷方式,它会安装一个副本,对吗?
所以我尝试将 RegistryValue/@Root 更改为 HKLM,但随后 WiX 抱怨:
错误 LGHT0204:ICE38:组件 cmpStartMenuShortcut 安装到用户配置文件。[原文如此] KeyPath 注册表项必须属于 HKCU。
错误 LGHT0204:ICE43:组件 cmpStartMenuShortcut 具有非广告快捷方式。[原文如此] KeyPath 注册表项应属于 HKCU。
错误 LGHT0204:ICE57:组件“cmpStartMenuShortcut”具有每个用户和每个机器的数据以及每个机器的 KeyPath。
我不明白为什么密钥必须在 HKCU 之下。