При работе с реестром 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.