大漠落日

while(!dead) study++;
posts - 46, comments - 126, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

RegCreateKeyEx的一个缺陷

Posted on 2009-11-02 15:43 乱78糟 阅读(1947) 评论(0)  编辑 收藏 引用 所属分类: C语言派系
用CRegKey类操作注册表,输入如下代码:
    CRegKey reg;
    LONG    lRet;
    
    lRet 
= reg.Open(HKEY_LOCAL_MACHINE, 
        _T(
"Software\\12345"),
        KEY_ALL_ACCESS);
    
if (ERROR_SUCCESS != lRet)
    {
        lRet 
= reg.Create(HKEY_LOCAL_MACHINE, 
            _T(
"Software\\12345"), REG_NONE,
            KEY_SET_VALUE);  //注意这个参数是错误的
        
        
if ( ERROR_SUCCESS != lRet )
        {
            
return;
        }
    }

运行之后发现注册表中该项已经成功添加,但是无法访问。点击就会弹出错误提示无法打开,系统无法访问指定的文件。由此生成了无法删除的垃圾注册表信息。

现在来分析一下,注意看create的第四个参数,我传入了错误的值KEY_SET_VALUE。应该为下面3个值中的一个:
  • REG_OPTION_BACKUP_RESTORE
    0x00000004L
  • REG_OPTION_NON_VOLATILE
    0x00000000L
  • REG_OPTION_VOLATILE
    0x00000001L
但是
   #define KEY_SET_VALUE           (0x0002)

如果传入这个值,那么Create(其实RegCreateKeyEx)函数检测不出来这个错误的参数,如果传入KEY_ALL_ACCESS可以检测出来,返回84错误(错误的参数)。由此猜想RegCreateEx错误检测dwOption参数采用类似这种方法:

   if (dwOption < REG_OPTION_NON_VOLATILE || dwOption > REG_OPTION_BACKUP_RESTORE)
      return 84;//对应的宏

由此看来,这是RegCreateKeyEx函数的问题,算缺陷吧。

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理