热情软件屋

 

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对注册表二进制值键值进行读写"

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio