代码之家  ›  专栏  ›  技术社区  ›  Johann Gerell

使用RegistryNotifyCallback与RegistryNotifyWindow的结果不一致

  •  0
  • Johann Gerell  · 技术社区  · 15 年前

    (我在WM 6.5上)

    我开始用 ::RegistryNotifyCallback 当监视注册表的某些部分时,但注意到一些应该到达的通知从未到达。我换成了 ::RegistryNotifyWindow 而丢失的通知也如期而至。我不记得重新编程的步骤了,因为这是一段时间以前的事了,但是现在由于其他原因我不得不回到回调版本[1],如果可能的话,我想消除最初的疑虑。

    • 有人注意到回调和窗口消息版本之间的“成功差异”吗?

    • 两者的功能是否有可能不同? 我假设回调和发布的窗口消息都有相同的源代码分支,我甚至认为 RegistryNotifyWindow 是通过 RegistryNotifyCallback 在wm core中,因此在调用回调或发布消息之间的决定是一个非常晚的活动(在ce/wm状态和notification broker core中),而在ms方面的一个bug似乎非常糟糕……

    [1]存在一个争用条件,有时会导致某些注册表更改在更改实际持久化/刷新到注册表之前被通知,因此在获取通知时读取该值会给出错误的结果。但是,回调数据参数和窗口消息wparam提供的“新值”确实是尚未刷新到注册表的正确值。自从 ●注册表通知窗口 只提供DWORD值,我需要字符串和二进制值,我必须更改为 ●RegistryNotifyCallback ,它正确地处理所有注册表值数据类型(我不想 ::Sleep 一秒钟以确保状态和通知代理刷新值)

    2 回复  |  直到 9 年前
        1
  •  1
  •   alan gillingham    12 年前

    我发现::registrynotifycallback和::registrynotifymsgqueue对于reg_dword都不可靠,但是reg_sz没有问题。奇怪的是,reg_dwords有时确实起作用,比如我手动编辑注册表值,但是当一个批处理a通知从另一个程序发送时,一些通知不会触发。

        2
  •  0
  •   Johann Gerell    15 年前

    经过一个多星期的测试,我得出结论,回调版本至少与窗口消息发布版本一样稳定,但由于对所有注册表值类型(不仅是regu dword,还有字符串和二进制)进行了全面处理,因此功能更加丰富。因此,我建议使用回调版本,尽管随后必须手动将数据编组到ui线程。