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为什么把空密码写入注册表就读不出来了
GetValue = Left$(resString, length - 1)改为: GetValue = Left$(resString,instr(resString,chr(0))-1)(说明:你的length = 1024,上面计算是个啥东西???,还有GetValue返回值为什么不设置为字符串string,而是变体类型variant)
==>
就这个提示而言,出现这种错误的可能性:resString为空或length-1小于0还有把这些信息写到注册表中可不是什么好办法,太容易就可以找到了!
这个还是错的!length-1小于0就对了