软件注册站
热情软件屋

 
为何两次调用RegQueryValue得到的答案不同
编号: QA004838    
建立日期: 2004年1月2日 最后修改日期: 2004年1月2日
所属类别: Visual Basic - Windows API
   
    操作系统: windows98
    编程工具: vb6.0
    问题: Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegQueryValue Lib "advapi32.dll" Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal lpValue As String, lpcbValue As Long) As Long
    
    Private Sub Form_Load()
    Dim S As String
    S = Space(lenS)
    RegQueryValue &H80000000, ".txt", S, lenS
    MsgBox S
    RegQueryValue &H80000000, ".txt", S, lenS
    MsgBox S
    End Sub
    

    ---------------------------------
    为何两次msgbox s得到的答案不同?
    水平: 刚入门(rooboonic)
   
    主要的问题是你没有给lenS赋初值。默认的初值为0。RegQueryValue的第4个参数表示你的缓冲区的大小,如果你的缓冲区大小比实际的内容短,RegQueryValue会把实际的长度传送给lenS变量。当你第2次调用RegQueryValue时,由于lenS不再为0,RegQueryValue就会把数据传送到S变量中。但是如果你的lenS的初值真是0,S = Space(lenS)将使S变成一个空串,这样做是危险的。因为第2次调用RegQueryValue时,由于S变量的空间不够大,可能导致错误,即使显示了结果也可能是错误的。
    应该这样修改你的程序:
    Private Sub Form_Load()
    Dim S As String
    S = Space(lenS)
    lenS = 200
    RegQueryValue &H80000000, ".txt", S, lenS
    MsgBox S
    lenS = 200 ' 建议每次调用RegQueryValue之前都这样做,以避免前一个调用影响后一个调用
    RegQueryValue &H80000000, ".txt", S, lenS
    MsgBox S
    End Sub
    

    

此问题由李海回答。

附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, Windows API, win32, api, windows api, gdi32, kernel

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

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