Inno Setup doesn't allow access to all registry keys, why?

John Lev picture John Lev · Oct 27, 2010 · Viewed 11.9k times · Source

I use this code to know if a key exists or not:

if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Autodesk') then
begin
  MsgBox('Key exists!!', mbInformation, MB_OK);
end;

for this example, it works, I have the message box, but with this it doesn't:

if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Autodesk\Maya') then
begin
  MsgBox('Key exists!!', mbInformation, MB_OK);
end;

But the Maya key exists on my computer. Can anybody help me?

EDIT :

In fact, it seems that Inno Setup don't access to the right keys...
For example, with this code I list all the subkeys of HKEY_LOCAL_MACHINE\SOFTWARE, but (!) the result is all subkey of 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;

Why this Wow6432Node key?

Answer

Epu picture Epu · Jun 13, 2011

It's not Inno Setup's fault at all; the Registry is virtualized in Vista and higher, and on 64-bit there are branches for native 64-bit and WOW'ed 32-bit.

In this case, since Inno Setup is a 32-bit program, the OS directs all of its HKLM\Software registry requests to the WOW6432Node.

To handle the registry virtualization in your installer, you can specifically use x86 and x64 key roots. For example, use HKLM32 or HKLM64 in your [Registry] section when you need to differentiate. In [Code] section, wrap registry helper function calls using HKLM64 in an if IsWin64 block.

This example works ok from our installer, whether or not the installer is declared as an x64 installer.

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;