Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление ошибок чтения реестра в Inno Setup для 64-битных систем

Delphi , ОС и Железо , Реестр

При создании установщика с использованием 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Реестр ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-13 21:06:39/0.0032150745391846/0