C#操作注册表REG_DWORD类型键异常(RegistryValueKind.DWord异常)解决方案

         在用C#操作注册表时,如果注册表键的类型是REG_DWORD,有可能遇到溢出BUG。网上这方面的资料很少,在这共享一下。

         C#可以用RegistryKey类的SetValue方法来设置键值,例如:



         看起来一切正常,但是这个RegistryValueKind.DWord是有问题的。

         注册表中的REG_DWORD是无符号32位数值,而C#中的RegistryValueKind.DWord是有符号32位数值。这就意味着RegistryValueKind.DWord的表示范围比REG_DWORD小,因此导致直接传入一些大数时会抛出异常提示类型不正确。

         那么如何解决这个BUG呢?

         读者可能试图这样做:

         openKey.SetValue("NoViewOnDrive",Convert.ToInt32("ffffffff",16), RegistryValueKind.DWord);

         目的是强制把参数转换成32位有符号数,这样是不行的,同样提示异常,因为ffffffff已经超出了有符号32位数的表示范围,无法转换。

         或者这样做:

         openKey.SetValue("NoViewOnDrive",Convert.ToUInt32 ("ffffffff",16), RegistryValueKind.DWord);

         目的是把参数强制转换成无符号32位表示,这样同样不行,SetValue方法内部会自动把参数转换成有符号32位表示,因此,我们的转换是徒劳的,还会被转换回去,而转换回去后,又会提示超出范围。

         其实,解决这个问题的方法很简单,只要把转换过程放在unchecked语句里就行了,unchecked语句块内的转换,不做溢出检查,溢出了直接用补码表示。例如:


Int32 tempInt = 0; //预先定义一个有符号32位数

//unchecked语句块内的转换,不做溢出检查
unchecked
{
    tempInt = Convert.ToInt32("ffffffff", 16); //强制转换成有符号32位数
}

//此时的tempInt已经是有符号32位数,可以直接写入注册表
openKey.SetValue("NoViewOnDrive", tempInt, RegistryValueKind.DWord);

         这样转折一下,就可以成功写入注册表了。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值