Уведомления об изменениях в реестре
октября 12 2009 by admin in АдминистрированиеЕще один способ эффективного использования реестра — применение уведомлений об изменениях в реестре. Приложение может узнать об изменениях раздела реестра с помощью функции RegNotifyChangeKeyValue. Она позволяет сообщить системе тип отслеживаемых изменений и указать, требуются ли вам уведомления о модификации подразделов. Эта функция объявлена так:
LONG RegNotifyChangeKeyValue( HKEY hkey, BOOL fWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL fAsynchronous);
Параметр hkey идентифицирует раздел, для которого вы хотите получать уведомления. Параметр fWatchSubtree показывает, хотите ли вы знать об изменениях всех подразделов выбранного раздела. Параметр dwNotifyFilter определяет тип отслеживаемых изменений.
RegNotifyChangeKeyValue можно вызывать как синхронно, так и асинхронно. Для синхронного использования параметр fAsynchronous нужно установить в FALSE. В таком режиме вызывающий поток находится в состоянии ожидания до получения уведомления об изменении в реестре. Используя функцию асинхронно, параметром hEvent нужно передать корректный описатель события, а параметр fAsynchronous установить в TRUE. В этом случае функция выполняется сразу, после чего система автоматически генерирует объект собыия ядра при возникновении изменений в реестре (соответствующих заданному фильтру).
Я предпочитаю использовать RegNotifyCbangeKeyValue асинхронно, так как при этом не нужны дополнительные потоки процесса. Не забывайте, что независимо от способа работы с функцией при каждом ее вызове посылается только одно уведомление. Для получения следующих уведомлений требуются повторные вызовы функции.
В случае завершения потока, вызвавшего RegNotifyCbangeKeyValue, система отменяет запрос на уведомление. Никаких проблем из-за этого, как правило, не появляется, так как практически всегда поток, вызвавший RegNotifyCbangeKeyValue, сам и ожидает событие.
Если поток, вызвавший RegNotifyCbangeKeyValue, завершается до получения уведомления об изменениях, система генерирует событие, освобождающее все ожидающие его потоки.
Чтобы завершить поток, вызвавший RegNotifyCbangeKeyValue, синхронно и при этом не изменять реестр, приложение должно закрыть описатель раздела.