时间:2021-05-19
今天遇到一个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);
这个可以用在测试上。一重启,之前创建的键值都没了。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
①创建主键、创建各类型的键值。②读取键值并分析键值类型。③枚举主键及键值。④判断键或键值是否存在。⑤查询注册表键的操作权限。⑥监视注册表根键、主键、键值,当发现
键值是计算机中注册表中的数值,注册表MicrosoftWindows中的一个重要的数据库,用于存储系统和应用程序的设置信息。键值只是注册表中的一项数值,删除键值
使用注册表编辑器,你可以在注册表中编辑主键(或子键),同时也可以修改键值项数据。建立主键(或子键)在注册表中,注册表编辑器左窗格显示主键或者子键的分层次关系。除
某些程序必须依赖指定运行环境。那么读取注册表来判断此电脑是否有执行环境是个很不错的办法。因为每个软件安装之后都会在注册表中注册对应的键值,并且有些键值是独一无二
office2010激活错误代码0X8007000D解决办法打开注册表编辑器,删掉注册表键值运行(快捷键win+R)-->输入RegEdit----------