从 VB.NET 中的注册表获取实际 REG_DWORD 十进制数的另一种方法?
Posted
技术标签:
【中文标题】从 VB.NET 中的注册表获取实际 REG_DWORD 十进制数的另一种方法?【英文标题】:Another route to get actual REG_DWORD decimal number from registry in VB.NET? 【发布时间】:2021-09-24 06:02:38 【问题描述】:我一直在将 GetValue 与 GetValueKind 一起使用,并且在读取大于有符号 32 位整数的 DWORD 时遇到了一个问题。我可以不受限制地写入注册表,达到最大值 4294967295(十六进制为 ffffffff)。
如果有办法用 int64 做到这一点,那么我就不会受到限制..
如果我可以读取十六进制值,我可以完成这项工作,我可以通过 int64 将其转换为十进制,但我不知道如何从注册表中读取十六进制值..
当它超过有符号的 32 位整数值 2,147,483,647 时,我应该采取其他方法让我读取正确的值吗?
谢谢
【问题讨论】:
它不只是环绕到 Integer.MinValue 吗?即你写 -1 并以 0xffffffff 结束,或者你写 -2,147,483,648 并以 0x80000000 结束 您先向我们展示您现在使用的实际代码如何?始终提供相关代码。 @CaiusJard 我看到了结果以及您对此有何看法,但不确定我如何使用该信息 我的意思是有符号整数和无符号整数是一回事;如果您在 regedit 中将您的值设置为 0xffffffffe,那么它会说它是 4294967294,如果您在 .net 中读取它会说它是 -2,因为无符号 4294967295 = -2 有符号。它都不需要通过int64,你只需要了解例如-1、4294967295 和 0xffffffff 都是一回事。如果您使用 .net 写入 -3,您的 regedit 将显示 4294967293 或 0xfffffffd。 int 从 0 变为 2,147,483,647 (0x7fffff),然后如果将 1 添加到它,它将变为 -2,147,483,648(作为 int)或 2,147,483,648 作为 uint @CaiusJard 感谢您的意见,对理解单位很有帮助。 【参考方案1】:DWORD 是 32 位无符号整数 - 不是有符号整数,因此请改用 UInt32
。
根据2.2.9 DWORD
DWORD 是一个 32 位无符号整数(范围:0 到 4294967295 十进制)。因为 DWORD 是无符号的,所以它的第一位(最高有效位) 位 (MSB)) 不保留用于签名。
Data Type Summary (Visual Basic)
资源:
Windows Data Types【讨论】:
感谢您的回复,尽管我了解到函数 GetValue 使用有符号整数这一事实。我无法使用我当前的代码获得 Unsigned 的值。 Textbox1.text = Registry.CurrentUser.OpenSubKey(PATH, False).GetValue(NAME) @user9938 您的数据类型摘要是正确的,但它具有误导性。说“int 从 0 到 2,147,483,647 然后 -2,147,483,648 到 -1”可能会更有帮助;进入项目属性高级编译并关闭溢出检查并将 int 设置为 int.MaxValue。然后加1;现在是 int.MinValue @CaiusJard 非常感谢您的投入。我确实设法通过首先获取字节然后从那里转换它来弄清楚它。我在上面发布了对我有用的内容【参考方案2】:Dim PATH as string = "HKEY_CURRENT_USER\Software\Test"
Dim NAME as string = "TestName"
Dim ft As String = "DOES_NOT_EXIST"
Dim gv As Object = Registry.GetValue(PATH, NAME, ft)
Dim gb As Byte() = BitConverter.GetBytes(CInt(gv))
Dim j As UInt32 = BitConverter.ToUInt32(gb, 0)
Textbox1.text = j
【讨论】:
以上是关于从 VB.NET 中的注册表获取实际 REG_DWORD 十进制数的另一种方法?的主要内容,如果未能解决你的问题,请参考以下文章