(я на WM 6,5)
Я начал использовать ::RegistryNotifyCallback
при мониторинге частей реестра, но заметил, что некоторые уведомления, которые должны поступить, никогда не поступали. Я переключился на ::RegistryNotifyWindow
и пропавшие уведомления пришли, как и ожидалось. Я не помню шагов репро, поскольку это было некоторое время назад, но теперь я вынужден вернуться к версии обратного вызова по другим причинам [1], и я хотел сгладить это первоначальное сомнение, если это возможно.
Кто-нибудь заметил какие-либо "расхождения в успехах" между версиями обратного вызова и оконного сообщения?
Возможно ли / возможно ли, что эти два будут функционировать по-разному? Я предполагаю, что и обратный вызов, и отправленное сообщение окна имеют один и тот же исходный код по ветвям, я даже думаю, что 1017 * реализован с помощью RegistryNotifyCallback
в ядре WM, так что решение между вызовом обратного вызова или публикацией сообщения является действительно поздним действием (в состоянии CE / WM и ядре посредника уведомлений) и существует ошибка в MS сторона кажется довольно хромой ...
[1] Существует условие гонки, которое иногда приводит к тому, что некоторые изменения в реестре уведомляются до того, как эти изменения действительно сохраняются / сбрасываются в реестр, поэтому чтение значения при получении уведомления дает неправильный результат. Однако «новое значение», предоставляемое параметром данных обратного вызова и WPARAM оконного сообщения, действительно является правильными значениями, которые еще не были сброшены в реестр. Так как ::RegistryNotifyWindow
предоставляет только значения DWORD, и мне нужны строковые и двоичные значения, я должен изменить на ::RegistryNotifyCallback
, который правильно обрабатывает все типы данных значений реестра (я не хочу ::Sleep
в течение секунды, чтобы гарантировать, что значения сбрасываются государством и брокером уведомлений)