При создании установщика с использованием Inno Setup для проверки имени продукта и номера основной версии Windows Server 2019 Datacenter пользователь столкнулся с проблемой, что не удается получить логи из файла Inno Setup. Проблема заключалась в том, что код, предназначенный для чтения значений из реестра Windows, не работал корректно.
Описание проблемы
Пользователь написал скрипт на Object Pascal для Inno Setup, который должен был читать значения из раздела реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion. Однако, несмотря на то, что значения ProductName и CurrentMajorVersionNumber существуют в указанном разделе реестра, скрипт не логировал их, и пользователь не видел никаких результатов выполнения.
Пример кода
function InitializeSetup(): Boolean;
var
ProductName: string;
CurrentMajorVersionNumber: string;
begin
if RegQueryStringValue(
HKEY_LOCAL_MACHINE, '\SOFTWARE\Microsoft\Windows NT\CurrentVersion',
'ProductName', ProductName) then
begin
Log(' > ProductName:' + ProductName)
end;
if RegQueryStringValue(
HKEY_LOCAL_MACHINE, '\SOFTWARE\Microsoft\Windows NT\CurrentVersion',
'CurrentMajorVersionNumber', CurrentMajorVersionNumber) then
begin
Log(' > CurrentMajorVersionNumber:' + CurrentMajorVersionNumber)
end;
end;
Подтвержденный ответ
Проблема заключалась в том, что Inno Setup - это 32-битное приложение, и по умолчанию оно получает перенаправление в HKLM\SOFTWARE\WOW6432Node при попытке доступа к HKLM\SOFTWARE на 64-битной системе. Чтобы получить доступ к реальному HKLM\SOFTWARE на 64-битной системе, необходимо использовать HKLM64. Для выбора между HKLM32 и HKLM64 можно использовать функцию IsWin64.
Также стоит учесть, что функция RegQueryStringValue предназначена для чтения строковых значений (REG_SZ), но не может быть использована для чтения значений типа REG_DWORD. Для чтения REG_DWORD необходимо использовать функцию RegQueryDWordValue.
Исправленный код
function InitializeSetup(): Boolean;
var
ProductName: string;
CurrentMajorVersionNumber: DWORD;
begin
if IsWin64 then
RegQueryStringValue(HKLM64, '\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName', ProductName)
else
RegQueryStringValue(HKLM, '\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName', ProductName);
if Result then
Log(' > ProductName:' + ProductName);
if IsWin64 then
RegQueryDWordValue(HKLM64, '\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'CurrentVersion', CurrentMajorVersionNumber)
else
RegQueryDWordValue(HKLM, '\SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'CurrentVersion', CurrentMajorVersionNumber);
if Result then
Log(' > CurrentMajorVersionNumber:' + IntToStr(CurrentMajorVersionNumber));
end;
Вывод
Правильное использование функций чтения реестра в Inno Setup на 64-битных системах требует учета их особенностей, таких как перенаправление в WOW6432Node и использование соответствующих функций для разных типов данных.
Пользователь столкнулся с ошибками при чтении реестра в Inno Setup для 64-битных систем из-за неправильного обращения к разделу реестра, что требует использования специальных функций для корректной работы на таких системах.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.