要写入注册表,您需要将 元素作为子元素添加到 。
在简短的 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 注册表项中。