【问题标题】:WIX 3.10 - write to HKLMWIX 3.10 - 写信给 HKLM
【发布时间】:2016-08-07 15:17:24
【问题描述】:

我正在尝试使用 WIX 安装程序将注册表值写入 HMLM,但到目前为止没有运气。

我已经阅读了官方文档,以及一些相关信息。可惜了,官方文档只写了怎么写给HKLU,不符合我的需求。

我也看过一些问题,比如Cannot create registry key value with WiX installer 但是如果我尝试这样做并将其放入

我有 x86 安装程序,还尝试按照建议写入 Software\Wow6432Node,但没有运气。

在 3.10 版本中设置可能会有些不同?有人可以写一些例子,包括一些环境来弄清楚应该如何以及在哪里放置值以在安装时创建注册表文件夹 + 键值并在卸载时删除它们?

非常感谢。

【问题讨论】:

    标签: installation wix windows-installer registry


    【解决方案1】:

    要写入注册表,您需要将 元素作为子元素添加到

    在简短的 sn-p 中,我创建了一个组件,该组件将在 HKLM\SOFTWARE\$(var.RegistryRootKeyName)\v7 的注册表中添加一个名为“ClientPath”的注册表项,其值为 INSTALLDIR 属性。

    <DirectoryRef Id="BIN">
        <Component Id="program.exe">
            <File Id="program.exe" KeyPath="yes" Source="$(var.BinariesDir)\_bin\program.exe" />
            <Shortcut       
                Id="ClientInstallDirShortcut" 
                Name="$(var.Product) $(var.InstallerVersion)" 
                Directory="INSTALLDIR"
                Target="[#program.exe]" 
                WorkingDirectory="BIN"/>
            <RegistryValue  
                Id="ClientInstallDirRegShortcut" 
                Root="HKLM" 
                Key="SOFTWARE\$(var.RegistryRootKeyName)\v7"                                         
                Type="string"
                Name="ClientPath"
                Value="[INSTALLDIR]"/>
        </Component>
    </DirectoryRef>
    

    现在,要创建此注册表,您需要将组件包含在安装期间安装的功能中。

    <Feature Id="ClientMain" Title="Client" Level="1" >
        <ComponentRef Id="program.exe" />
    </Feature>
    

    因为您拥有此注册表位置,一旦您卸载与该组件相关的所有内容,Windows 安装程序将自动删除注册表项,并且创建的文件夹(如果它们为空)也会自动删除。

    我认为您遇到的问题与 HKLM\SOFTWARE\Wow6432Node 的混淆有关。您实际上不必在注册表项中指定 Wow6432Node。如果你这样做了,那么你的注册表项可能是 HKLM\SOFTWARE\Wow6432Node\Wow6432Node\...

    当您在 64 位计算机上打开/创建注册表项时,您可以看到注册表的两个“视图”。您可以使用 32 位视图或 64 位视图。

    当您使用 32 位视图时,Wow6432Node 会自动插入到 HKLM\SOFTWARE\... 的注册表项路径中。您可以通过将 Win64="yes" 添加到您的 registryvalue 元素来强制使用 64 位视图,但您应该确保您只是尝试在 64 位机器上写入或读取 64 位注册表。

    注册表使用的默认视图与进程的位数相关。如果您在 64 位机器上运行 64 位进程安装程序,要访问 32 位注册表位置,您需要设置 Win64="no"(我认为这是它的工作原理) .同样,对于 32 位安装程序,默认视图是 32 位注册表,它会自动将 Wow6432Node 添加到您的 HKLM\SOFTWARE 注册表项中。

    【讨论】:

    • 再次感谢布赖恩!你拯救了我的一天 :) 问题似乎出在 Wow6432Node 中——它确实产生了重复的密钥。说到组件本身——我把它放在组件组中作为一个单独的组件。我不知道如果它没有在任何地方使用,它为什么需要设置“目录”属性,但它现在可以工作了。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 2023-04-10
    • 2014-06-12
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多