21

我使用此代码来了解密钥是否存在:

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钥匙?

4

3 回答 3

22

这根本不是 Inno Setup 的错。注册表在 Vista 和更高版本中是虚拟化的,在 64 位上,有本地 64 位和 WOW'ed 32 位的分支

在这种情况下,由于 Inno Setup 是一个 32 位程序,操作系统会将其所有HKLM\Software注册表请求定向到WOW6432Node.

要在安装程序中处理注册表虚拟化,您可以专门使用 x86 和 x64 键根。例如,当您需要区分时,在您的部分中使用HKLM32或。在部分中,将注册表帮助函数调用包装在一个块中。HKLM64[Registry][Code]HKLM64if 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;
于 2011-06-13T16:41:27.643 回答
18

让我猜猜……您使用的是 64 位的 Windows 7?

这根本不是 InnoSetup 的错,而是注册表在 Vista 及更高版本中被虚拟化,并且在 64 位上存在原生 64 位和 WOW'ed 32 位的分支

在这种情况下,由于 InnoSetup 是一个 32 位程序,操作系统将其所有 HKLM\Software Registry 请求定向到 WOW6432Node。

如果您的程序是 64 位,那么您也想使用 64 位安装程序。

于 2010-10-27T15:09:32.543 回答
1

你确定这Software\Autodesk\Maya是一个注册表项吗?也许它只是一个值,你必须使用RegValueExists.

于 2010-10-27T14:01:01.160 回答