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

后端 未结 3 2016
逝去的感伤
逝去的感伤 2020-12-17 10:55

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

if RegKeyExists(HKEY_LOCAL_MACHINE, \'Software\\Autodesk\') then         


        
相关标签:
3条回答
  • 2020-12-17 11:15

    Are you sure that Software\Autodesk\Maya is a registry key? Maybe it's just a value and you have to use RegValueExists.

    0 讨论(0)
  • 2020-12-17 11:25

    Let me guess... you're on Windows 7 64-bit?

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

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

    If your program is 64-bit, then you want to use a 64-bit setup program too.

    0 讨论(0)
  • 2020-12-17 11:37

    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;
    
    0 讨论(0)
提交回复
热议问题