Inno Setup 不允许访问所有注册表项,为啥?
Posted
技术标签:
【中文标题】Inno Setup 不允许访问所有注册表项,为啥?【英文标题】:Inno Setup doesn't allow access to all registry keys, why?Inno Setup 不允许访问所有注册表项,为什么? 【发布时间】:2011-05-01 08:14:45 【问题描述】:我使用此代码来了解密钥是否存在:
if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Autodesk') then
begin
MsgBox('Key exists!!', mbInformation, MB_OK);
end;
对于这个例子,它可以工作,我有消息框,但它没有:
if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Autodesk\Maya') then
begin
MsgBox('Key exists!!', mbInformation, MB_OK);
end;
但是Maya
密钥存在于我的计算机上。有人可以帮帮我吗?
编辑:
实际上,Inno Setup 似乎无法访问正确的键...
例如,在这段代码中,我列出了HKEY_LOCAL_MACHINE\SOFTWARE
的所有子键,但是(!)结果是HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
的所有子键...
if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, 'SOFTWARE', Names) then
begin
S := '';
for I := 0 to GetArrayLength(Names)-1 do
S := S + Names[I] + #13#10;
MsgBox('List of subkeys:'#13#10#13#10 + S, mbInformation, MB_OK);
end;
为什么是这个Wow6432Node
键?
【问题讨论】:
您的设置正常吗? 需要一个可接受的答案;你可以选择一个吗? 【参考方案1】:这根本不是 Inno Setup 的错; the Registry is virtualized 在 Vista 及更高版本中,在 64 位上则有 branches for native 64-bit and WOW'ed 32-bit。
在这种情况下,由于 Inno Setup 是 32 位程序,操作系统会将其所有 HKLM\Software
注册表请求定向到 WOW6432Node
。
要在安装程序中处理注册表虚拟化,您可以专门使用 x86 和 x64 键根。例如,当您需要区分时,在您的[Registry]
部分中使用HKLM32
或HKLM64
。在[Code]
部分,使用HKLM64
将注册表帮助函数调用包装在if IsWin64
块中。
无论安装程序是否声明为 x64 安装程序,此示例在我们的安装程序中都可以正常工作。
function Mobu120x64IsAvailable(): Boolean;
var
resultString: String;
begin
resultString := 'No';
if IsWin64 then
begin
Result := RegValueExists(HKLM64, 'SOFTWARE\Autodesk\MotionBuilder\2012', 'InstallPath');
if Result then begin
resultString := 'Yes';
end;
Log('Win64: Found Mobu 12.0 for x64?:' + resultString);
end;
end;
【讨论】:
那里的关键语句:“这些值的后缀可能是 32 或 64。后缀为 32 的根键值(例如,HKLM32)映射到注册表的 32 位视图;后缀为 64(例如 HKLM64)的根键值映射到注册表的 64 位视图。"【参考方案2】:让我猜猜……您使用的是 64 位 Windows 7?
这根本不是 InnoSetup 的错,在 Vista 及更高版本中是 the Registry is virtualized,而在 64 位上则有 branches for native 64-bit and WOW'ed 32-bit。
在这种情况下,由于 InnoSetup 是 32 位程序,操作系统会将其所有 HKLM\Software Registry 请求定向到 WOW6432Node。
如果您的程序是 64 位的,那么您也想使用 64 位的安装程序。
【讨论】:
是的,谢谢,这是我的问题!但我需要制作一个适用于 32 位和 64 位的安装程序。它只是一个独立于架构的 Maya(3D 软件)插件。但是 Maya 可以是 32 位或 64 位,我需要知道将我的文件复制到正确的文件夹中。如果我使用 x64 安装程序,它将无法在 x86 上运行,但我不想制作 2 个安装程序。在不制作 x64 安装程序的情况下绕过 WOW6432Node 链接的解决方案? 嗯...我从来不需要自己用 InnoSetup 构建 x64 包。但是帮助文档包括关于32- vs 64-bit 和limitations of 64-bit installs 的几个参考资料,这些参考资料有助于阐明重定向会影响什么,什么不是。但首先你可能需要通过设置ArchitecturesInstallIn64BitMode to "x64"...来启用64位模式... @ewall:我建议将这些 Inno 帮助链接放在您的实际答案中,而不仅仅是 cmets。 除非您编写了 64 位插件,否则您不需要需要 64 位安装程序,@John。 64 位程序(例如 Maya)不能使用 32 位插件,所以如果您的 32 位安装程序无法检测到 64 位 Maya 的存在,那也没关系——您正在安装的东西无论如何都不会在那里工作. 我刚刚在使用motion builder 2012 x64时遇到了这个问题。如果我这样做:[Setup] ArchitecturesInstallIn64BitMode=x64
它可以找到密钥,但是找不到它需要查找的 x86 密钥。 EnableFsRedirection 的文档包含一个将模式临时翻转回 x86 模式的示例。如果您没有在 x64 模式下启动,则无法使用示例代码启用 x64 模式。【参考方案3】:
您确定Software\Autodesk\Maya
是注册表项吗?也许它只是一个值,你必须使用RegValueExists
。
【讨论】:
是的,它是一个键,我也无法访问它的所有子键。以上是关于Inno Setup 不允许访问所有注册表项,为啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Inno Setup 根据注册表项选择在文件夹中安装插件/文件?
如何使用 Inno Setup pascal 脚本从注册表中读取 MachineGuid
跪求inno setup补丁包更新后,卸载程序不能删除注册表?
Inno Setup 5 安装包制作!reg2iss,Inno Setup 问题。Inno Setup 怎么批量导入reg文件,(像nsis