Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix 从安装程序将安装位置写入注册表_Wix_Windows Installer_Wix3.6 - Fatal编程技术网

Wix 从安装程序将安装位置写入注册表

Wix 从安装程序将安装位置写入注册表,wix,windows-installer,wix3.6,Wix,Windows Installer,Wix3.6,我正在使用创建一个安装程序 其中一个需要是根据ALLUSERS属性将安装位置的位置写入HKCU或HKLM中的注册表 根据我所做的研究,我认为以下几点应该可行 <RegistryKey Root="HKMU" Key="Software\OpenCover" Action="createAndRemoveOnUninstall"> <RegistryValue Name="Location"

我正在使用创建一个安装程序

其中一个需要是根据ALLUSERS属性将安装位置的位置写入HKCU或HKLM中的注册表

根据我所做的研究,我认为以下几点应该可行

<RegistryKey Root="HKMU" 
             Key="Software\OpenCover" 
             Action="createAndRemoveOnUninstall">
  <RegistryValue  Name="Location" 
                  Type="string" 
                  Value="[APPLICATIONFOLDER]" 
                  Action="write" 
                  KeyPath="yes" />
</RegistryKey>

有人能解释一下如何完成我需要完成的任务吗?我猜你的安装程序没有升级(启用UAC?),对HKLM的写入被重定向到HKCU


BTW,您也可以考虑从应用程序中使用Windows安装程序API来查询升级代码、产品代码、产品信息(安装位置),而无需编写注册表项来存储该元数据。

< P>问题实际上是与64位平台上的32位安装程序有关。 在本场景中使用ALLUSERS=“1”时,使用HKMU标记的注册表项实际上正在写入,但在本例中为HKLM\Software\Wow6432Node\OpenCover。我怀疑标记为HKLM的条目也会以相同的方式重定向

不幸的是,上的文档没有解释32/64位的“魔法”重定向,而有关实际注册表项的详细信息也没有出现在日志中


为了了解正在发生的事情,下面的文章对观察到的行为进行了澄清。从本文中我们可以看到,安装程序“认为”它正在写入文件夹HKLM\Software,但实际上它被“重定向”到HKLM\Wow6432Node\Software,用于64位平台上的32位进程,因此解释了为什么它没有反映到日志文件中。文章还解释了为什么当ALLUSERS=“”和HKMU是HKCU时,条目出现在人们期望的地方,因为这些条目在32位和64位应用程序之间是“共享”的。

HKCU只在ALLUSERS=“”(这是预期的)时编写,当ALLUSERS=“1”时,我在HKLM或HKCU下看不到条目。该条目供第三方生成系统(如nant/msbuild)使用,以便它们可以在生成过程中启动应用程序,并且这些系统已经有一个注册表实用程序来帮助编写脚本。我认为这不是UAC,因为当应用程序为ALLUSERS=“1”时,代码被放置在正确的位置(程序文件)。我很困惑为什么它没有失败,因为没有条目。。。我要在上面贴一个标签,看看发生了什么。感谢您的建议日志超过200K,但是我想我已经计算出来了-条目正在编写中,但在HKLM\Software\Wow6432Node\OpenCover下-这是因为,据我所知,安装程序是64位机器上的32位。应用程序代码实际上是任何CPU(本机COM对象除外),但我不希望32/64环境中有多个安装程序。对不起,我认为这是常识,我们正在解决一个更难的问题。不用担心,不像您想象的那样常见。5-6年前,我写了很多WiX安装程序,都是在32位平台上,这是我第一次处理多个平台和全用户/每台机器的设置。我知道问题出在我身上,但我想我只是缺少了一个设置,而不是几个脑细胞:)谢谢你的帮助。那是因为32位进程在64位操作系统上的虚拟环境中工作:WOW64(Windows上的Windows)。不仅注册表项被重定向,程序文件和系统目录也被重定向:因此32位进程实际上并不知道它从
程序文件(x86)
读取文件,它仍然认为它可以与
程序文件一起工作。安装程序也会受到这些重定向的影响。如果安装64位,则使用64位msiexec;如果是32位软件包,则使用32位msiexec。
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: