求助,注册表操作,高分100
Const REG_SZ = 1
Const REG_BINARY = 3
Const REG_DWORD = 4
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
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 RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx 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
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String
Dim lResult As Long, lValueType As Long, strBuf As String, lDataBufSize As Long
lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize)
If lResult = 0 Then
If lValueType = REG_SZ Then
strBuf = String(lDataBufSize, Chr$(0))
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)
If lResult = 0 Then
RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)
End If
ElseIf lValueType = REG_BINARY Then
Dim strData As Integer
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)
If lResult = 0 Then
RegQueryStringValue = strData
End If
ElseIf lValueType = REG_DWORD Then
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)
If lResult = 0 Then
RegQueryStringValue = strData
End If
End If
End If
End Function
Function GetString(hKey As Long, strPath As String, strValue As String)
Dim Ret
RegOpenKey hKey, strPath, Ret
GetString = RegQueryStringValue(Ret, strValue)
RegCloseKey Ret
End Function
Sub SaveStringWORD(hKey As Long, strPath As String, strValue As String, strData As String)
Dim Ret
RegCreateKey hKey, strPath, Ret
RegSetValueEx Ret, strValue, 0, REG_DWORD, CLng(strData), 4
RegCloseKey Ret
End Sub
Sub DelSetting(hKey As Long, strPath As String, strValue As String)
Dim Ret
RegCreateKey hKey, strPath, Ret
RegDeleteValue Ret, strValue
RegCloseKey Ret
End Sub
Path1 = GetString(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\App Paths\F:\source fileetBar\Server.exe", "Path")
Text1.Text = Path1
Path2 = GetString(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\App Paths\source fileetBar\Server.exe", "Path")
Text2.Text = Path2
上面这段代码执行后,为什么text1为空,而text2却不会啊,请问Path1里的那个F:怎么处理才可以读出来啊(path1和path2的差别就是那个F:)
我现在要把path1的值读出来,可是读出来的老是NULL值啊
问题点数:100、回复次数:17Top
1 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2006-09-11 13:26:37 得分 10
再检查一下写入注册表的代码吧,注册表里如果没有HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows\CurrentVersion\App Paths\F:\source fileetBar\Server.exe"这个子键, 那你读出来当然是空啊。Top
2 楼linzhe1314()回复于 2006-09-11 13:49:03 得分 0
有的,键值我都知道,只是程序不认识“F:”它啊Top
3 楼linzhe1314()回复于 2006-09-11 13:49:39 得分 0
关键是“F:”那个冒号,怎么处理Top
4 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2006-09-11 14:01:36 得分 0
没见过在注册表中建立这样的键的,你完全可以把"F:\source fileetBar\Server.exe"这些放入path的值里面啊,为什么非得放在键名里面?Top
5 楼linzhe1314()回复于 2006-09-11 14:03:49 得分 0
别人的软件,我现在要读取的是它的安装目录的路径
Top
6 楼zq972(最近不想写代码,好累~~~~)回复于 2006-09-11 14:48:33 得分 0
目录太深了,跟F:没有关系不支持8级目录............
不信的话 "Software\Microsoft\Windows\CurrentVersion\App Paths\F:\source fileetBar\Server.exe"
在"Software\Microsoft\Windows\CurrentVersion\App Paths\F:\source fileetBar"下建一个键值去读读看就知道了Top
7 楼happy_sea(开心海(数据读取中,请稍候......))回复于 2006-09-11 14:58:46 得分 0
那个作者放的这么深,那他自己能读出来?Top
8 楼linzhe1314()回复于 2006-09-11 15:10:33 得分 0
哦,原来是这样啊,那有什么办法解决的吗Top
9 楼linzhe1314()回复于 2006-09-11 15:16:07 得分 0
作者好像是故意这么做的,请教高手,有什么办法可以解决吗Top
10 楼zq972(最近不想写代码,好累~~~~)回复于 2006-09-11 16:58:15 得分 90
问题找到了
应该用
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long打开键值
在bas中添加
Const KEY_QUERY_VALUE = &H1&
Const KEY_SET_VALUE = &H2&
Const KEY_CREATE_SUB_KEY = &H4&
Const KEY_ENUMERATE_SUB_KEYS = &H8&
Const KEY_NOTIFY = &H10&
Const KEY_CREATE_LINK = &H20&
Const READ_CONTROL = &H20000
Const WRITE_DAC = &H40000
Const WRITE_OWNER = &H80000
Const SYNCHRONIZE = &H100000
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const STANDARD_RIGHTS_READ = READ_CONTROL
Const STANDARD_RIGHTS_WRITE = READ_CONTROL
Const STANDARD_RIGHTS_EXECUTE = READ_CONTROL
Const KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
再把你的GetString改成
Function GetString(hKey As Long, strPath As String, strValue As String)
Dim Ret
RegOpenKey hKey, strPath, 0, KEY_READ, Ret
GetString = RegQueryStringValue(Ret, strValue)
RegCloseKey Ret
End Function
再试一下吧
Top
11 楼linzhe1314()回复于 2006-09-11 17:43:28 得分 0
提示:
编译错误:
错误的参数号或无效的属性值Top
12 楼linzhe1314()回复于 2006-09-12 00:00:58 得分 0
哎,还解决不了啊。。。。。Top
13 楼zq972(最近不想写代码,好累~~~~)回复于 2006-09-12 08:52:47 得分 0
呵呵,我帮你把申明以及函数重写一遍给你好了
Public Const KEY_QUERY_VALUE = &H1&
Public Const KEY_SET_VALUE = &H2&
Public Const KEY_CREATE_SUB_KEY = &H4&
Public Const KEY_ENUMERATE_SUB_KEYS = &H8&
Public Const KEY_NOTIFY = &H10&
Public Const KEY_CREATE_LINK = &H20&
Public Const READ_CONTROL = &H20000
Public Const WRITE_DAC = &H40000
Public Const WRITE_OWNER = &H80000
Public Const SYNCHRONIZE = &H100000
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const STANDARD_RIGHTS_READ = READ_CONTROL
Public Const STANDARD_RIGHTS_WRITE = READ_CONTROL
Public Const STANDARD_RIGHTS_EXECUTE = READ_CONTROL
Public Const KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Public Const REG_SZ = 1
Public Const REG_BINARY = 3
Public Const REG_DWORD = 4
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
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 RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegQueryValueEx 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
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Public Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String
Dim lResult As Long, lValueType As Long, strBuf As String, lDataBufSize As Long
lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize)
If lResult = 0 Then
If lValueType = REG_SZ Then
strBuf = String(lDataBufSize, Chr$(0))
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)
If lResult = 0 Then
RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)
End If
ElseIf lValueType = REG_BINARY Then
Dim strData As Integer
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)
If lResult = 0 Then
RegQueryStringValue = strData
End If
ElseIf lValueType = REG_DWORD Then
lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)
If lResult = 0 Then
RegQueryStringValue = strData
End If
End If
End If
End Function
Public Function GetString(hKey As Long, strPath As String, strValue As String)
Dim Ret As Long
Dim a As Long
a = RegOpenKeyEx(hKey, strPath, 0, KEY_READ, Ret)
GetString = RegQueryStringValue(Ret, strValue)
RegCloseKey Ret
End Function
这样就OK了。
Top
14 楼linzhe1314()回复于 2006-09-12 09:27:20 得分 0
上面这位热心的大哥,我试了,还是不能用,不知道你有没试,如果你试了能用的话,那可能是我人品有问题吧Top
15 楼zq972(最近不想写代码,好累~~~~)回复于 2006-09-12 09:49:55 得分 0
我试了阿,可以用的,把你的代码发给我,我看看
zq972@163.comTop
16 楼zq972(最近不想写代码,好累~~~~)回复于 2006-09-12 09:50:33 得分 0
你要完全copy我的说明到bas文件中去哦Top
17 楼linzhe1314()回复于 2006-09-12 09:57:30 得分 0
请查收,我已经发过去了Top




