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] 部分中使用HKLM32HKLM64。在[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卸载时为啥不能强制删除安装目录

inno setup 打包说明

如何使用 Inno Setup pascal 脚本从注册表中读取 MachineGuid

跪求inno setup补丁包更新后,卸载程序不能删除注册表?

Inno Setup 5 安装包制作!reg2iss,Inno Setup 问题。Inno Setup 怎么批量导入reg文件,(像nsis