我正在使用WiX 3.6来创建安装程序。
其中一个需求是根据ALLUSERS属性将安装位置的位置写入HKCU或HKLM中的注册表。
现在根据我所做的研究,我认为以下内容应该有效
<RegistryKey Root="HKMU"
Key="Software\OpenCover"
Action="createAndRemoveOnUninstall">
<RegistryValue Name="Location"
Type="string"
Value="[APPLICATIONFOLDER]"
Action="write"
KeyPath="yes" />
</RegistryKey>
问题是它只适用于ALLUSERS =“”,即HKMU被解释为HKCU。
如果我尝试ALLUSERS = 1的perMachine安装,那么该条目不会按预期写入HKLM,但是当我查看安装程序日志文件时,我看到对WriteRegistryValues的调用。
MSI (s) (D4:14) [22:46:24:901]: Executing op: ActionStart(Name=WriteRegistryValues,Description=Writing system registry values,Template=Key: [1], Name: [2], Value: [3])
Action 22:46:24: WriteRegistryValues. Writing system registry values
MSI (s) (D4:14) [22:46:24:902]: Executing op: ProgressTotal(Total=2,Type=1,ByteEquivalent=13200)
MSI (s) (D4:14) [22:46:24:903]: Executing op: RegOpenKey(Root=-1,Key=Software\OpenCover,,BinaryType=0,,)
MSI (s) (D4:14) [22:46:24:903]: Executing op: RegAddValue(Name=ConsoleLocation,Value=C:\Program Files (x86)\OpenCover\,)
WriteRegistryValues: Key: \Software\OpenCover, Name: ConsoleLocation, Value: C:\Program Files (x86)\OpenCover\
MSI (s) (D4:14) [22:46:24:906]: Executing op: RegCreateKey()
WriteRegistryValues: Key: \Software\OpenCover, Name: , Value:
有人可以解释如何完成我需要完成的任务
答案 0 :(得分:2)
问题实际上与64位平台上的32位安装程序有关。
当在这种情况下使用ALLUSERS =“1”时,实际上正在编写用HKMU标记的注册表项,但在这种情况下,HKLM \ Software \ Wow6432Node \ OpenCover。我怀疑标记为HKLM的条目也会以同样的方式重定向。
不幸的是WriteRegistryValues Action上的文档没有解释32/64位的“魔术”重定向,并且有关实际注册表项的详细信息没有出现在日志中。
为了深入了解正在发生的事情,以下文章揭开观察到的行为Registry Keys Affected by WOW64的神秘面纱。在本文中,我们可以看到安装程序“认为”它正在写入文件夹HKLM \ Software,但实际上这是“重定向”到HKLM \ Wow6432Node \ Software,以便在64位上进行32位进程位平台,因此解释了为什么它没有反映到日志文件中。本文还解释了为什么当ALLUSERS =“”和HKMU然后HKCU为什么条目出现在人们期望它们的位置时,因为这些条目是“共享”在32位和64位应用程序之间。
答案 1 :(得分:0)
我的猜测是你的安装程序没有升级(启用了UAC?)以及对HKLM的写入被重定向到HKCU。
顺便说一句,您还可以考虑在应用程序中使用Windows Installer API来查询UpgradeCode,ProductCode,ProductInformation(INSTALLLOCATION),而无需编写注册表项来存储此元数据。