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

Мониторинг изменений в 64-битном ключе реестра из 32-битного приложения на Delphi

Delphi , Синтаксис , Справочник по API-функциям

Мониторинг изменений в 64-битном ключе реестра из 32-битного приложения на Delphi

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

Проблема

Разработчик столкнулся с трудностью, пытаясь использовать функцию RegNotifyChangeKeyValue для отслеживания изменений в 64-битном ключе реестра. При этом, чтобы открыть такой ключ из 32-битного приложения, необходимо добавить флаг доступа KEY_WOW64_64KEY. Однако, несмотря на это, изменения в 64-битном ключе не отслеживались, в то время как изменения в его 32-битном аналоге (с ключом в Wow6432Node) обнаруживались.

Решение

Проблема была в том, что при создании события для мониторинга изменений использовался неверный код:

CreateEvent(Nil, True, False, 'RegistryChangeMonitorEvent')

Вместо этого, необходимо использовать:

CreateEvent(nil, True, False, nil)

Также было замечено, что использование 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




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


:: Главная :: Справочник по API-функциям ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:17:22/0.0032379627227783/0