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
.