C++ &引用;“提神”;更改注册表项后的windows注册表

C++ &引用;“提神”;更改注册表项后的windows注册表,c++,windows,winapi,registry,C++,Windows,Winapi,Registry,案例: 注册表项的DWORD值为0 将注册表项值更改为1 再次读取该值:它仍然是0 必须重新启动程序才能读取新值 我在谷歌上四处搜索,看着克里基班的学生,但我看不到任何能回答我问题的东西。我还知道,例如explorer.exe在注册表更改生效时必须重新启动 有没有办法在运行时获取注册表的新“副本” 编辑:原来我上面的案例是完全错误的。这是其他地方的一个bug,阻止我读取新值。有一个函数:RegFlushKey() 也许这就是您正在寻找的,但是这个函数应该由修改注册表的代码调用 以下是评论的摘录

案例:

  • 注册表项的DWORD值为0
  • 将注册表项值更改为1
  • 再次读取该值:它仍然是0
  • 必须重新启动程序才能读取新值

    我在谷歌上四处搜索,看着克里基班的学生,但我看不到任何能回答我问题的东西。我还知道,例如explorer.exe在注册表更改生效时必须重新启动

    有没有办法在运行时获取注册表的新“副本”


    编辑:原来我上面的案例是完全错误的。这是其他地方的一个bug,阻止我读取新值。

    有一个函数:RegFlushKey()

    也许这就是您正在寻找的,但是这个函数应该由修改注册表的代码调用

    以下是评论的摘录:

    调用RegFlushKey是一个昂贵的操作,它会 影响系统范围的性能,因为它会消耗磁盘带宽和 阻止注册表配置单元中所有进程对所有项的修改 正在刷新,直到刷新操作完成。RegFlushKey 仅当应用程序必须保证 注册表更改将在之后立即保留到磁盘 修改。对键所做的所有修改对其他用户可见 无需将其刷新到磁盘的进程

    如果程序只在启动时读取注册表,那么它就是这样做的。如果它是您的程序,那么您需要更改它以在每次执行相关操作时重新读取注册表项,或者每隔一段时间轮询注册表以检查值是否已更改。否则,您将重新启动程序

    或者,通常情况下,如果您直接编写注册表而不是调用正确的API来更改设置,请不要这样做

    编辑:哦,这是一种误读问题的方式,尽管上面的内容与您提到的Explorer之类的案例有关


    如果程序正在重新读取打开的HKEY,则可能存在缓存问题,无法看到其他程序的更改。不管“规范”注册表是在RAM中还是刷新到磁盘,这都不重要——这更像是一个持久性问题。

    我确实尝试过这个<代码>注册表刷新键(reg)在我关闭regkey之前,但它似乎不起作用。这就好像呈现给每个程序的注册表是程序开始时的一个快照。我将检查返回值以防万一..我建议您使用sysinternals中的procmon来检查您的程序在注册表中所做的更改,这可能会显示出什么错误。结果证明我的问题是不正确的。这个案例实际上运行得很好,是我代码中的一个bug把我搞砸了。。我仍然会接受你的回答,因为它帮助了我。至于RegFlushKey,我无法让它与reg.m_hKey或hKey(reg)一起工作,其中reg是CRegKey。它返回错误代码6
    error\u INVALID\u HANDLE
    ,它通过发送一个根键作为参数tho(如HKEY\u CURRENT\u USER)来工作。