当前位置:  编程技术>c/c++/嵌入式

基于重启后消失的注册表键值的详细介绍

    来源: 互联网  发布时间:2014-10-14

    本文导语:  今天遇到一个bug,折腾了半天才解决掉,分享给大家。Bug描述一位开发人员调用下面的代码来创建一个注册表键值: 代码如下:HKEY hKey;if(::RegOpenKeyEx(HKEY_CURRENT_USER, DemoRegKey, 0, KEY_WRITE, &hKey) != ERROR_SUCCESS){    RegCreateKeyEx(HKEY_CURRENT...

今天遇到一个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);

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

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux 重启与重启网络的区别
  • Linux下怎样配置,让apache及其httpd服务,在机器重启后也重启
  • 改了/etc/fstab文件,重启之后就提示file system readonly,无法重启.
  • linux命令行下用ctrl+alt+del重启计算机是否是正确的重启方法?
  • 一个腾讯面试题,如何设计服务进程,让业务进程重启后,服务进程可以自动继续重启前的服务?
  • 修改/etc/fstab之后,必须重启系统吗?
  • 怎样编程重启系统?
  • ubuntu visodu增加apache用户权限后用重启系统吗
  • 有没有什么指令可以查看谁重启机器了
  • 为何LINUX服务器下的NAT重启后老是失效?急!!!
  • 请问vnc下远程重启的问题。。。
  • linux命令如何实现重启父进程而不会使其子进程退出
  • 请问下如何重启文件系统
  • 通过线程 如可监控tomcat是否正常 重启tomcat
  • linux重启后无法通过ssh连接
  • 如何重启apache服务
  • 如何在solaris系统下,重启SNMP服务。
  • CentOS 5.4每次开机检查磁盘,然后不停重启
  • 软硬件速度不匹配时,有没有可能引起重启?
  • 求教:Linux下Java应用程序的重启脚本


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3