参考这里的示例,我向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会出现以下错误:
error LGHT0204:ICE38:组件cmpStartMenuShortcut安装到用户配置文件中。 它的KeyPath注册表键必须位于HKCU下。
error LGHT0204:ICE43:组件cmpStartMenuShortcut具有非广告快捷方式。 它的KeyPath注册表键应该位于HKCU下。
error LGHT0204:ICE57:组件'cmpStartMenuShortcut'具有既有每个用户又有每台计算机数据的每台计算机KeyPath。
我不明白为什么键必须在HKCU下。
KeyPath
写入HKLM,而未广告的快捷方式需要一个注册表KeyPath
,但广告快捷方式则不需要,你并没有真正回答这个问题。 - Drazen Bjelovuk