新型重量级的注册表API---RegGetValue

如果要从注册表中取出一个值,我们应该调用RegQueryValueEx。不幸的是,这个函数有一些致命的问题。最大的问题就是它不会执行返回数据类型检查。举个例子,假如注册表中包含一个字符串类型,这个数据在注册表中可能不是以null结尾的,下面是一些说明:

 

    假如数据是REG_SZ, REG_MULTI_SZ或REG_EXPAND_SZ类型,字符串中可能没有正确的包含以null结尾的字符。例如,如果一个字符串数据是12个字符而且传入的buffer大于它,函数返回的时候就会自动加入一个null字符并且返回大小是13*sizeof(TCHAR)字节。但是,如果这个buffer是12*sizeof(TCHAR)字节,这个数据会成功保存但是不会包含null字符。甚至这个函数返回的是ERROR_SUCCESS,应用程序在使用这个字符串之前需要确保这个字符串是不是被正确的结尾了。否则,可能会出现缓冲区溢出。(注意,REG_MULTI_SZ必须要有两个null结尾的字符,这个函数最多只会加一个null字符)

 

不幸的是,很多人都不能判断这个逻辑的正确性(这个几乎很难对所有的用例都处理正确)。除了这个null结尾的问题,调用者需要处理任何类型的返回值,你必须增加检查代码来确保返回的数据类型是不是你想要的。这个根本原因就是一个“泄漏概念”问题-以NT为基础的注册表API函数只是简单的保存数据的一小部分,这些类型信息是以元数据的形式存在的。因此当你从注册表中取出一个值,你取到的还是那些元数据。因而这没有办法确保返回的元数据是不是符合程序的要求,因为程序的目的是没有办法知道的。

 

因而MS提供了一个全新的API用来解决这些问题RegGetValue.使用这个函数,我能够删除:

 

  1. 检查注册表数据类型的代码

     

  2. Handle REG_EXPAND_SZ 的逻辑,这个函数会自动handle

     

  3. 对注册表字符串检查有没有null结尾的代码

     

  4. 验证注册表字符串的长度代码(是不是2的倍数)

     

  5. 再也不需要打开注册表句柄(这个API自动会打开和关闭句柄)

     

当然还会有更多的好处等待你的发现。

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值