RegQueryValueEx函数返回二进制值到字符串出错
编号:QA002682
建立日期: 2000年3月6日 最后修改日期:2000年11月27日
所属类别:
吴昊:
操作系统: Microsoft Windows 98 中文版
编程工具: Microsoft Visual Basic 6.0 中文版
问题: 我在编辑时用API函数读取注册表的BINARY值时遇到如下问题:
我用RegQueryValueEx函数返回二进制值时,如果二进制值中某一位的十六进制代吗小于80时可以正常返回,但若大于80时就会返回00,如注册表中有一BINARY值为64006400, 用字符串变量返回值时为四个字节长(包括终止符),其ASCII码别为100,0,100,0 而若注册表中的值为 95006400时,所返回的字符串值只有二字节长(包括终止符)每一位的ASCII码为 100,0 (也就是说只返回了 6400 的值而没有返回 9500的值)请问这是何故?
回答:
你必须牢记,在VB中不能使用字符串来保存二进制数据。简单的说,在中文版中,如果使用字符串保存二进制数据可能会出现半个汉字的情况,这是不允许的,具体的原理参考QA000051 "VB 5提示错误:"输入超出文件尾""。二进制数据应该保存在数组中。你可以定义一个二进制数组,如:
Dim nBytes(3) As Byte
然后把nBytes(0)(即数组首地址)传递给RegQueryValueEx函数,让RegQueryValueEx函数把数据放在数组中。如果你读的类型是DWORD型,也可以直接定义:
Dim dwDWord As Long
然后把dwDWord的地址传递给RegQueryValueEx函数。
吴昊问:
操作系统: Microsoft Windows 98 OEM
编程工具: Microsoft Visual Basic CHS
问题: 以前我问过如何在VB中读取注册表中的二进制值,得到的答复是用一个 Byte 类型的数组,但我每次用 RegQueryValueEx 函数时它总说我的 Byte 类型数组“类型不匹配”,这如何解决?另外这只是读,如何写呢?
回答:
关键是你DLL的声明有问题,你可以这样声明:
Private Declare Function RegQueryValueExAny Lib "advapi32.dll" Alias _
"RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As _
String, ByVal lpReserved As Long, lpType As Long, lpData As _
Any, lpcbData As Long) As Long
Const HKEY_CURRENT_USER = &H80000001
Const REG_DWORD As Long = 4
Const REG_BINARY = 3 ' Free form binary
请注意lData声明为Any类型。
调用如下:
Dim nBytes(0 To 3) As Byte
RegQueryValueExAny HKEY_CURRENT_USER, "DefaultLcid", 0, REG_BINARY, nBytes(0), 4
至于写注册表,使用RegSetValueEx,方法相同。
XLH问:
我有一个问题向您请教,怎样读写注册表中的二进制值.我想写入一个二进制值"b5 00 00 00",可我使用的方法写入后却是"00 00 00 00",请问为甚麽,该怎样做?我是初级水平,望您能给予指点。(附件中的源代码
regbin.zip是我下载的,并不是我自己写的),万分感谢! Windows 98中文版 VB5.0中文企业版
答:你下载的这段代码在英文系统中是正确的,但在中文系统中是错误的。原因就是上面提到的,在读写二进制数据时不能使用字符串,而在你的例子中使用了Chr函数。要保证中文系统中正确,必须象上面提到的那样使用Byte数组。需要指出的是,目前网上下载的许多例子(包括微软提供的一些例子),都存在类似的不能在中文系统下正常工作的问题,需要小心。
相关问题:
QA002553 "如何用VB5对注册表二进制值键值进行读写"
此问题由李海回答。
| |
|
|
| |
|
|