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

Как получить доступ к реальным 64-битным значениям реестра Windows из 32-битной программы на Delphi

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

При работе с реестром Windows в среде 32-битных приложений на платформе Delphi может возникнуть проблема, связанная с доступом к 64-битным значениям. Это связано с тем, что 32-битные приложения по умолчанию имеют доступ к 32-битной версии реестра, даже если они запущены в 64-битной операционной системе. Решение этой проблемы заключается в использовании специального флага при открытии ключа реестра.

Проблема описана в вопросе пользователя:

При попытке чтения данных из раздела реестра HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run с использованием компонента TRegistry и методов OpenKeyReadOnly, GetValueNames, вместо ожидаемых 64-битных значений возвращаются данные из 32-битного раздела HKLM\SOFTWARE\__Wow6432Node__\Microsoft\Windows\CurrentVersion\Run. Это происходит даже если программа запущена от имени административного аккаунта и используются функции RegOpenKeyEx и RegEnumValue.

Решение проблемы:

Чтобы получить доступ к реальным 64-битным значениям реестра, необходимо использовать флаг KEY_WOW64_64KEY при создании экземпляра класса TRegistry. Этот флаг указывает, что приложение должно работать с 64-битной версией реестра. Флаг должен быть объединён с другими флагами, используемыми для запроса или доступа к значениям реестра, с помощью оператора OR.

Пример кода на Object Pascal (Delphi):

{$APPTYPE CONSOLE}
uses
  Windows,
  Classes,
  Registry,
  SysUtils;

procedure ReadRegistry;
var
  Registry: TRegistry;
  List    : TStrings;
begin
  Registry := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY);
  List     := TStringList.Create;
  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;
    if Registry.OpenKeyReadOnly('\SOFTWARE\Microsoft\Windows\CurrentVersion\Run') then
    begin
       Registry.GetValueNames(List);
       Writeln(List.Text);
    end;
    Registry.CloseKey;
  finally
    Registry.Free;
    List.Free;
  end;
end;

begin
  try
   ReadRegistry();
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
  Readln;
end.

Важные замечания:

  • Флаг KEY_WOW64_64KEY должен быть установлен при создании экземпляра TRegistry, иначе OpenKeyReadOnly может сбросить свойство Access в KEY_READ, что приведёт к чтению 32-битной версии реестра.
  • В некоторых случаях, при рекурсивном перечислении ключей реестра, может возникнуть проблема с бесконечным перемещением между 64-битными и 32-битными версиями ключей. Для решения этой проблемы можно использовать проверку на наличие подстроки "Wow6432Node" в имени ключа и, в случае обнаружения, переключаться на 32-битный доступ.
  • В старых версиях Delphi (например, Delphi 2005) поддержка KEY_WOW64_64KEY отсутствует, и потребуется поиск альтернативных решений или обновление среды разработки.

Использование данного подхода позволит 32-битным приложениям на Delphi корректно читать 64-битные значения реестра в операционных системах Windows, поддерживающих 64-битные приложения.

Создано по материалам из источника по ссылке.

Проблема заключается в том, что 32-битная программа на Delphi не может получить доступ к 64-битным значениям реестра Windows без использования специального флага, который позволяет работать с 64-битной версией реестра.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-26 08:43:28/0.0052621364593506/1