Непоследовательные результаты с использованием RegistryNotifyCallback против RegistryNotifyWindow - PullRequest
0 голосов
/ 22 марта 2010

(я на WM 6,5)

Я начал использовать ::RegistryNotifyCallback при мониторинге частей реестра, но заметил, что некоторые уведомления, которые должны поступить, никогда не поступали. Я переключился на ::RegistryNotifyWindow и пропавшие уведомления пришли, как и ожидалось. Я не помню шагов репро, поскольку это было некоторое время назад, но теперь я вынужден вернуться к версии обратного вызова по другим причинам [1], и я хотел сгладить это первоначальное сомнение, если это возможно.

  • Кто-нибудь заметил какие-либо "расхождения в успехах" между версиями обратного вызова и оконного сообщения?

  • Возможно ли / возможно ли, что эти два будут функционировать по-разному? Я предполагаю, что и обратный вызов, и отправленное сообщение окна имеют один и тот же исходный код по ветвям, я даже думаю, что 1017 * реализован с помощью RegistryNotifyCallback в ядре WM, так что решение между вызовом обратного вызова или публикацией сообщения является действительно поздним действием (в состоянии CE / WM и ядре посредника уведомлений) и существует ошибка в MS сторона кажется довольно хромой ...

[1] Существует условие гонки, которое иногда приводит к тому, что некоторые изменения в реестре уведомляются до того, как эти изменения действительно сохраняются / сбрасываются в реестр, поэтому чтение значения при получении уведомления дает неправильный результат. Однако «новое значение», предоставляемое параметром данных обратного вызова и WPARAM оконного сообщения, действительно является правильными значениями, которые еще не были сброшены в реестр. Так как ::RegistryNotifyWindow предоставляет только значения DWORD, и мне нужны строковые и двоичные значения, я должен изменить на ::RegistryNotifyCallback, который правильно обрабатывает все типы данных значений реестра (я не хочу ::Sleep в течение секунды, чтобы гарантировать, что значения сбрасываются государством и брокером уведомлений)

Ответы [ 2 ]

1 голос
/ 31 мая 2012

Я считаю, что :: RegistryNotifyCallback и :: RegistryNotifyMsgQueue ненадежны для REG_DWORD, но REG_SZ не проблема.Странно, что REG_DWORD иногда работают, например, если я вручную изменяю значение реестра, но когда пакет отправляет уведомления из другой программы, некоторые уведомления не запускаются.

0 голосов
/ 29 марта 2010

После более чем недели тестирования я пришел к выводу, что версия обратного вызова, по крайней мере, так же стабильна, как версия для публикации сообщений в окне, но гораздо более универсальна благодаря полной обработке всех типов значений реестра, не только REG_DWORD, но строки и двоичные файлы Поэтому я рекомендую версию обратного вызова, хотя сортировка данных в потоке пользовательского интерфейса должна выполняться вручную.

...