У меня есть 32-разрядный установщик жемчуга. Используя это я должен смочь установить и удалить и 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
.
Однако вышеупомянутый данный код установщика жемчуга пытается читать из HKLM/Software/WOW6432Node/Microsoft/Windows/CurrentVersion/Uninstall
и это не находит установку там.
Таким образом, как я делаю код Perl, работающий в 32_bit процесс для чтения значения реестра, найденного в 64-разрядном улье? Я знаю RegOpenKey()
API, который берет KEY_WOW64_64KEY
параметр. Но так как это - Windows API, я не знаю, поможет ли это. Даже затем есть ли какая-либо другая альтернатива?
Да, нужно использовать KEY_WOW64_64KEY, другого обходного пути для 32-битного процесса нет. Вызов Win32 API непосредственно из Perl представляется возможным, судя по этой веб-странице.
Вы также можете напрямую вызвать программу reg, а не командный файл:
$WINDIR/system32/reg.exe
Это расположение по умолчанию для reg.exe, если он включен в операционную систему. .
$WINDIR/sysnative/reg.exe
Это виртуальное расположение собственного 64-битного reg.exe при запуске из 32-битного процесса.