在NSIS中导入registry项时出错

我正在通过NSIS安装程序为我的应用程序打包。 在包装我需要为我的应用程序做一些registry项。 这些条目将位于registrypath“HKLM \ SOFTWARE \ Wow6432Node \ Microsoft”和“HKLM \ SOFTWARE \ Microsoft”中。

问题是当我通过NSIS中的[ExecWait“regedit.exe / s registry.reg”]命令导入registry时,registry项不会被添加到path“HKLM \ SOFTWARE \ Microsoft”,只能在其他条目将被添加。 并且在NSIS安装程序中,在“HKLM \ SOFTWARE \ Wow6432Node \ Wow6432Node \ Microsoft”这个path中会有一个新的条目,因为我没有在registry文件中包含任何类似的registry项。

我检查了registry文件,没有问题。 我试图通过直接运行registry文件,也试图直接在bat文件以及CMD(regedit.exe / s registry.reg)相同的命令。 所有工作正常。 只有在NSIS它不工作。 任何帮助将是伟大的。

编辑 :操作系统:Windows 7,64位

NSIS版本:2.46

我猜你的应用程序安装程序是32位的。 由于它是一个32位安装程序,每个注册表操作都会通过应用兼容性关键字“Wow6432Node”的窗口自动转换。 看到这个关于注册表重定向的链接

用于在32位和64位注册表之间进行切换,您的代码应如下所示:

SetRegView 64 WriteRegDWORD HKLM "SOFTWARE\<Key1>\<Key2>" "Value" 0 SetRegView 32 WriteRegStr HKLM "SOFTWARE\<Key1>\<Key2>" "Value" "1" 

因为nsis有自己的本地函数来修改Windows注册表,使用ExecWait regedit.exe /s registry.reg不是一个好主意

从32位应用程序调用Exec "regedit.exe"将启动32位Regedit,并导致Wow6432Node \ Wow6432Node问题。

真正的解决方案是使用Reg2Nsis或其他转换工具将您的.reg文件转换为WriteRegStrSetRegView指令。

你可以尝试用这个丑陋的黑客来运行64位的Regedit:

 !include x64.nsh ${DisableX64FSRedirection} ExecWait '"$WinDir\Regedit.exe" /whatever' ${EnableX64FSRedirection}