При работе с 64-битными ключами реестра из 32-битных приложений на языке Delphi может возникнуть проблема с мониторингом изменений. Это связано с особенностями работы 32-битных приложений в 64-битной операционной системе, где существует разделение на 32-битный и 64-битный просмотр реестра.
Проблема
Разработчик столкнулся с трудностью, пытаясь использовать функцию RegNotifyChangeKeyValue для отслеживания изменений в 64-битном ключе реестра. При этом, чтобы открыть такой ключ из 32-битного приложения, необходимо добавить флаг доступа KEY_WOW64_64KEY. Однако, несмотря на это, изменения в 64-битном ключе не отслеживались, в то время как изменения в его 32-битном аналоге (с ключом в Wow6432Node) обнаруживались.
Решение
Проблема была в том, что при создании события для мониторинга изменений использовался неверный код:
Также было замечено, что использование KEY_ALL_ACCESS не является необходимым, и лучше использовать KEY_NOTIFY при открытии ключа для передачи в RegNotifyChangeKeyValue, а для чтения изменений использовать KEY_READ. Это позволяет избежать необходимости запуска программы от имени администратора.
Пример кода
Пример кода, который корректно отслеживает изменения в 64-битном представлении реестра из 32-битного процесса:
program RegMonitor;
{$APPTYPE CONSOLE}
uses
SysUtils, Windows;
procedure Main;
const
dwFilter: DWORD =
REG_NOTIFY_CHANGE_NAME or
REG_NOTIFY_CHANGE_ATTRIBUTES or
REG_NOTIFY_CHANGE_LAST_SET or
REG_NOTIFY_CHANGE_SECURITY;
var
Error: Integer;
key: HKEY;
begin
Error := RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
'Software\Microsoft\Windows\CurrentVersion\RunOnce',
0,
KEY_NOTIFY or KEY_WOW64_64KEY,
key
);
if Error <> ERROR_SUCCESS then
RaiseLastOSError(Error);
try
Error := RegNotifyChangeKeyValue(
key,
True,
dwFilter,
0,
False
);
if Error <> ERROR_SUCCESS then
RaiseLastOSError(Error);
Writeln('Change detected');
Readln;
finally
RegCloseKey(key);
end;
end;
begin
Main;
end.
Заключение
Использование функции RegNotifyChangeKeyValue для мониторинга изменений в 64-битном ключе реестра из 32-битного приложения на Delphi возможно, при условии правильного использования флага KEY_WOW64_64KEY и корректного создания события для мониторинга. Важно также правильно выбирать флаги доступа при открытии ключа реестра.
Необходимо мониторить изменения в 64-битном ключе реестра из 32-битного приложения на Delphi, учитывая особенности работы с 64-битными ресурсами из 32-битной среды.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.