Inno Setup не разрешает доступ ко всем разделам реестра, почему?

Я использую этот код, чтобы узнать, существует ли ключ:

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

Позвольте мне угадать... вы в Windows 7 64-бит?

Это не ошибка InnoSetup вообще, это что реестр виртуализирован в Vista и выше, а на 64-битном уровне есть ветки для родных 64-битных и WOW'ed 32-бит.

В этом случае, поскольку InnoSetup является 32-разрядной программой, ОС направляет все свои запросы HKLM\Software Registry в WOW6432Node.

Если ваша программа 64-разрядная, вы также хотите использовать 64-разрядную программу установки.

Ответ 2

Это не ошибка Inno Setup вообще; Реестр виртуализирован в Vista и выше, а в 64-битной версии есть ветки для собственной 64-битной и WOW 32-битной.

В этом случае, поскольку Inno Setup является 32-разрядной программой, ОС направляет все свои запросы реестра HKLM\Software на WOW6432Node.

Для управления виртуализацией реестра в вашем инсталляторе вы можете использовать корни ключей x86 и x64. Например, используйте HKLM32 или HKLM64 в разделе [Registry], когда вам нужно провести различие. В разделе [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;

Ответ 3

Вы уверены, что Software\Autodesk\Maya является разделом реестра? Возможно, это просто значение, и вы должны использовать RegValueExists.