Public Sub Main()
    '定义标志变量,用来检测读取注册表是否成功
    Dim flag As Long
        
    flag = 0
    
    Set gcnnConnection = New ADODB.Connection
    
    '检测注册表中是否存在子键Public Const REGSUBKEY = "Software\学生管理系统"
    flag = CheckKey(HKEY_CURRENT_USER, REGSUBKEY)
   
    '如果检测到子键,那么就分别读取该键中的键值,为链接数据库所用
    If flag = 0 Then
        mDbIp = GetValue(HKEY_CURRENT_USER, REGSUBKEY, _
            "Ip", REG_SZ)
        mDb = GetValue(HKEY_CURRENT_USER, REGSUBKEY, _
            "Db", REG_SZ)
        mDbUser = GetValue(HKEY_CURRENT_USER, REGSUBKEY, _
            "User", REG_SZ)
        mDbPsw = GetValue(HKEY_CURRENT_USER, REGSUBKEY, _   
            "Password", REG_SZ)             '我设置密码为空, 每执行到取密码就提示无效的过程调用或参数
           
            
        '创建到数据库的链接,链接成功则返回True,同时,
        '传址方式的参数,将改变链接对象gcnnConnection
        '在以后的程序中,该公共链接对象可用
        blnConnected = gADOConnection(gcnnConnection)
        
        '数据库链接通过,则出现系统登录窗口
        If (blnConnected = True) Then
            Load frmPsw
            frmPsw.Show
        Else '登录数据库失败,则显示配置数据库窗口
            Load frmDBInfo
            frmDBInfo.Show
        End If
    Else
        '如果没有检测到键值,则打开ODBC设置窗体,进行新的配置
        If (flag <> 0) Then
            Load frmDBInfo
            frmDBInfo.Show
        Else
            MsgBox "注册表创建失败!"
        End If
    End If
End Sub
'*****************************************************************
'功能:从注册表中取得键值
'输入:
'   plKey                   Long        根键名
'   psKey                   String      主键名
'   ValueName                String      子键名
'   输出:    GetValue                String      取得的注册表键值
'说明: 仅仅支持 DWORD, SZ, 和 BINARY value 这三种类型.
'******************************************************************
Function GetValue(ByVal plKey As Long, ByVal psKey As String, _
    ByVal ValueName As String, ByVal KeyType As Integer, _
    Optional DefaultValue As Variant = Empty) As Variant
   ' On Error Resume Next
    Dim hKey As Long, resLong As Long
    Dim resString As String, length As Long
    Dim resBinary() As Byte
    On Error GoTo errhandle
    '先赋值为默认值.
    GetValue = DefaultValue
    '打开键,如果没有找到则退出
    If RegOpenKeyEx(plKey, psKey, 0, KEY_READ, hKey) Then Exit Function
    
    Select Case KeyType
        Case REG_DWORD
            '读出键值,如果没有找到则用默认值
            If RegQueryValueEx(hKey, ValueName, 0, REG_DWORD, _
                resLong, 4) = 0 Then
                GetValue = resLong
            End If
        Case REG_SZ
            length = 1024: resString = Space$(length)
            If RegQueryValueEx(hKey, ValueName, 0, REG_SZ, _
                ByVal resString, length) = 0 Then
                ' 如果找到了值,去掉字符串尾部的字符串结尾标志符Chr(0)
                GetValue = Left$(resString, length - 1) 
            End If
        Case REG_BINARY
            length = 4096
            ReDim resBinary(length - 1) As Byte
            If RegQueryValueEx(hKey, ValueName, 0, REG_BINARY, _
                resBinary(0), length) = 0 Then
                ReDim Preserve resBinary(length - 1) As Byte
                GetValue = resBinary()
            End If
        Case Else
            err.Raise 1001, , "Unsupported value type"
    End Select
errhandle:
    GetValue = ""
    RegCloseKey hKey
End Function为什么把空密码写入注册表就读不出来了

解决方案 »

  1.   

    ' 如果找到了值,去掉字符串尾部的字符串结尾标志符Chr(0)
    GetValue = Left$(resString, length - 1)改为:  GetValue = Left$(resString,instr(resString,chr(0))-1)(说明:你的length = 1024,上面计算是个啥东西???,还有GetValue返回值为什么不设置为字符串string,而是变体类型variant)
      

  2.   

    GetValue = Left$(resString, length - 1)总是提示错误"无效的过程调用或参数"  
    ==>
    就这个提示而言,出现这种错误的可能性:resString为空或length-1小于0还有把这些信息写到注册表中可不是什么好办法,太容易就可以找到了!
      

  3.   

    GetValue = Left$(resString,instr(resString,chr(0))-1) 
    这个还是错的!length-1小于0就对了