• 重启后消失的注册表键值


    原文:http://www.cnblogs.com/greenerycn/archive/2010/09/20/REG_OPTION_VOLATILE.html

    今天遇到一个bug,折腾了半天才解决掉,分享给大家。

    Bug描述

    一位开发人员调用下面的代码来创建一个注册表键值:

    HKEY hKey;if(::RegOpenKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, KEY_WRITE, &hKey) != ERROR_SUCCESS){    RegCreateKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, NULL, REG_OPTION_VOLATILE        , KEY_ALL_ACCESS   , NULL   , &hKey, NULL);        }

    执行后,成功的在注册表编辑器中看到了键值,后续从中获取值等代码没有任何问题。

    提交测试后发现,当系统重启后,上面的程序创建的注册表键值都没有了,导致后面读取键值的代码都报错。

    Why?

    随后我调整了代码,发现下面的代码在重启后得到的错误码是2

    LONG lRet;lRet = ::RegOpenKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, KEY_WRITE, &hKey);

    执行这段代码lRet的值是2. 错误码2的意思是:系统找不到指定的文件。 对于注册表函数而已,就是对应的键不存在。

    调试后发现,创建注册表的代码的确成功执行了,在注册表中也可以看得到。同时,再调用读取键值的代码,也没有任何问题。但是一旦重启电脑,路径就不存在了,里面保存的键值都没有了。

    看来是某些程序删掉了我的键值,于是查找所有删除键值的代码,没有找到。

    在重启前将所有的程序都删除掉。但是重启后,该死的键值还是没有出现。

    看来是系统或者其它程序删除的。难道我的键值和某些程序的键值重名了?好,这次用guid做键名,还是重启后没有了。

    哇哇,真是抓狂啊。

    这时候,我回过头来再细看所有创建注册表相关的代码,因为必定是我的程序导致键值消失的。

    我注意到了REG_OPTION_VOLATILE  这个奇怪的参数。

    MSDN之后,我终于找到了原因,就是这个参数造成的。

     

     

    原因

    REG_OPTION_VOLATILE  这个参数的意思是创建的注册表键值都位于内存中,不会保存到相应的注册表文件中

    英文如下:

    All registry keys are created as volatile, and the information is stored in memory and is not preserved when the corresponding registry hive is unloaded. For HKEY_LOCAL_MACHINE, this occurs when the OS is shut down. The RegSaveKey function does not save volatile registry keys. This flag is ignored for keys that already exist.

    所以,重启后这些键值当然就没有了。

    解决办法

    很简单,使用REG_OPTION_NON_VOLATILE 即可

    RegCreateKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, NULL, REG_OPTION_NON_VOLATILE            , KEY_ALL_ACCESS   , NULL   , &hKey, NULL);        

    这个可以用在测试上。一重启,之前创建的键值都没了。

    参考资料

    RegCreateKeyEx Function

    http://msdn.microsoft.com/en-us/library/ms724844(VS.85).aspx

  • 相关阅读:
    LeetCode 104
    LeetCode 100
    LeetCode 27
    LeetCode 7
    LeetCode 8
    蘑菇街2017春招笔试
    codeforces 5D
    codeforces 5C
    codeforces 875B
    codeforces 876B
  • 原文地址:https://www.cnblogs.com/lzjsky/p/1867098.html
Copyright © 2020-2023  润新知