У меня есть 32-битный установщик Perl. Используя это, я должен иметь возможность устанавливать и удалять как 32-, так и 64-битные приложения.
Установка 32- и 64-битных в порядке. Удаление 32-битной тоже нормально.
Однако у меня возникла проблема при удалении 64-разрядных приложений.
Приложение просто знает имя приложения, как показано в разделе «Установка и удаление программ» на панели управления. Например, это может быть «Winzip 14.0», которое является отображаемым именем для Winzip.
Я использую следующий подход для удаления: я перехожу к HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall
и анализирую имеющиеся там ключи, чтобы проверить, совпадает ли Winzip. Если так, я получаю оттуда строку удаления.
my $register = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
$HKEY_LOCAL_MACHINE->Open($register,$hKey)|| die $!;
#Then parse all the nodes and fetch the uninstall string
Если приложение является 64-разрядной установкой, информация об удалении будет храниться в HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall
.
Однако приведенный выше код установщика perl пытается прочитать из
HKLM/Software/WOW6432Node/Microsoft/Windows/CurrentVersion/Uninstall
и он не находит там установку.
Итак, как мне заставить Perl-код, запущенный в 32-битном процессе, прочитать значение реестра, найденное в 64-битном кусте? Мне известно о RegOpenKey()
API, который принимает параметр KEY_WOW64_64KEY
. Но так как это Windows API, я не знаю, поможет ли это. Даже тогда, есть ли другая альтернатива?