【问题标题】:How to tell which value triggered RegNotifyChangeKeyValue?如何判断哪个值触发了 RegNotifyChangeKeyValue?
【发布时间】:2013-11-10 09:54:08
【问题描述】:

我正在使用RegNotifyChangeKeyValue API 来跟踪对我的注册表项的更改以及类似于该 MSDN 页面底部给出的 C++ 示例。我这样设置这个 API:

RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Company\\Product", 0, KEY_NOTIFY, &hKey);
RegNotifyChangeKeyValue(hKey, FALSE, REG_NOTIFY_CHANGE_LAST_SET, hEvent, TRUE);

也就是说,当这个 API 将作为参数的事件发出信号(这意味着对 Software\Company\Product 键的更改)时,有没有办法找出实际触发它的值?

【问题讨论】:

    标签: c++ windows winapi registry


    【解决方案1】:

    没有。您需要在调用 RegNotifyChangeKeyValue 之后缓存当前的名称/值对,然后在收到信号后,您可以将最新的名称/值对与您的缓存进行比较,看看有什么不同,然后为下一个信号更新您的缓存。

    如果您在调用 RegNotifyChangeKeyValue 之前构建缓存,并且在两个操作之间由某个线程进行了更新,那么您的缓存将不会反映实际状态,并且可能会导致下一次更新出现问题(取决于您的需要) .

    在 RegNotifyChangeKeyValue 之后构建缓存可能会导致您的代码收到信号但无法知道所关注的值(如果更新是由两个操作之间的另一个线程进行的)。没什么大不了的:只是假装没有看到任何变化。

    【讨论】:

    • 谢谢。我也是那么想的。我试图避免的是从该键中读取所有值。当只更改一两个值时,这听起来像是在浪费 CPU 周期。但是你提出的一个可能的竞争条件确实可以解释事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    相关资源
    最近更新 更多