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?


person John Lev    schedule 27.10.2010    source источник
comment
У тебя нормально заработала установка?   -  person Epu    schedule 06.10.2011
comment
Нужен принятый ответ; Вы можете выбрать один?   -  person Epu    schedule 20.08.2016


Ответы (3)


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

В этом случае, поскольку 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;
person Epu    schedule 13.06.2011
comment
Ключевое предложение здесь: Значения могут иметь суффикс 32 или 64. Значения корневого ключа с суффиксом 32 (например, HKLM32) сопоставляются с 32-разрядным представлением реестра; значения корневого ключа с суффиксом 64 (например, HKLM64) сопоставляются с 64-разрядным представлением реестра. - person Epu; 07.02.2013

Дайте угадаю... у вас 64-битная Windows 7?

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

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

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

person ewall    schedule 27.10.2010
comment
Да, спасибо, это моя проблема! Но мне нужно сделать установщик, который работает на 32 и 64 битах. Это просто плагин для Maya (3D Software), не зависящий от архитектуры. Но Maya может быть 32-битной или 64-битной, и мне нужно знать это для копирования моих файлов в нужную папку. Если я использую установщик x64, он не будет работать на x86, но я не хочу делать 2 установщика. решение обойти ссылку WOW6432Node без создания установщика x64? - person John Lev; 27.10.2010
comment
Хм... Мне никогда не приходилось самостоятельно собирать пакет x64 с помощью InnoSetup. Но справочные документы содержат несколько ссылок на 32- и 64-разрядные версии. и ограничения 64-разрядных установок, помогающие понять, на что влияет перенаправление, а что нет. Но сначала вам, вероятно, потребуется включить 64-битный режим, установив для ArchitecturesInstallIn64BitMode значение x64... - person ewall; 27.10.2010
comment
@ewall: я рекомендую поместить эти ссылки справки Inno в ваш фактический ответ, а не просто в комментарии. - person Oliver Giesen; 28.10.2010
comment
Если вы не написали 64-битный плагин, вам не нужен 64-битный установщик, @John. 64-разрядная программа (например, Maya) не может использовать 32-разрядные плагины, поэтому ничего страшного, если ваш 32-разрядный установщик не может определить наличие 64-разрядной версии Maya — то, что вы устанавливаете, все равно там не будет работать. . - person Rob Kennedy; 29.10.2010
comment
У меня только что была эта проблема с Motion Builder 2012 x64. Если я делаю: [Setup] ArchitecturesInstallIn64BitMode=x64 ключи находят нормально, но ключи x86, которые нужно найти, не найдены. Документация для EnableFsRedirection включает пример временного переключения режима обратно в режим x86. Вы не можете включить режим x64, используя пример кода, если вы не начали в режиме x64. - person Epu; 10.06.2011
comment
Однако EnableFsRedirection не включает перенаправление реестра. - person Epu; 13.06.2011

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

person splash    schedule 27.10.2010
comment
Да, это ключ, и я не могу получить доступ ко всем его подразделам. - person John Lev; 27.10.2010