高分请教,怎样用API删除指定的子项。好像在Win2K中用RegDeleteKey,如果想删除的子项中还有子项,不能删除。我贴了代码,那位帮我完善我

bgxy 2002-09-11 11:45:28
我的代码如下:
Private Const HKEY_LOCAL_MACHINE As Long = &H80000002
Private Const ERROR_SUCCESS As Long = 0& '成功访问

'打开指定的key的API函数
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String, _
ByVal dwReserved As Long, _
ByVal samDesired As Long, _
phkResult As Long) As Long

'删除指定的seb key的API函数
Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" _
(ByVal hKey As Long, _
ByVal lpSubKey As String) As Long

'关闭指定key的句柄的API函数
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long


Public Function DeleteSubKey(ByVal strSubKey As String) As Boolean
Dim lnghSubKey As Long
Dim lngResult As Long
Dim funResult As Long

DeleteSubKey = False

'打开指定的Key和Sub Key
lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strSubKey, 0, KEY_ALL_ACCESS, lnghSubKey)

'如果没有发现指定的Key和Sub Key
If lngResult <> ERROR_SUCCESS Then
Err.Raise 1000, , "指定的子项不存在!"
'关闭key
Call RegCloseKey(lnghSubKey)
Exit Function
End If

'删除指定的Key和Sub Key
Dim KeyName As String
Dim lngKeyCnt As Long
Dim lngKeyLen As Long
Dim udtFileTime As FILETIME

'删除子项
funResult = RegDeleteKey(lnghSubKey, strSubKey)

'关闭key
Call RegCloseKey(lnghSubKey)
DeleteSubKey = (funResult = ERROR_SUCCESS)

End Function



如果用RegEnumKeyEx可以枚举指定子项中的子项,我的思路是枚举全部的子项,逐个删除(没有子项就可以用RegDeleteKey删除了)。那位帮我完善我的代码?
...全文
30 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bgxy 2002-09-12
  • 打赏
  • 举报
回复
谢谢回答!这段代码我看过,是《用VB操作注册表(七)》吧?
首先这段代码的ret = RegDeleteKey(hSubKey, "") 之后的
If ret <> 0 Then
Name=String(256,chr(0))
是多余的,应该删掉,另外好像枚举SubKey,不推荐使用RegEnumKey,推荐使用RegEnumKeyEx。

用RegEnumKeyEx枚举SubKey用以下的代码,可我总是不能像RegEnumKey那样正常使用。能帮我改过来吗?

函数参数:strKey,strSubKey,ByRef strEnumKeyArray() As String
lngResult = RegOpenKeyEx(strKey, _
strSubKey, _
0, _
KEY_ALL_ACCESS, _
lnghSubKey)

If lngResult <>0 Then Exit Function

Do While lngEnumRet = ERROR_SUCCESS
'建立枚举的值名的缓存
strKeyName = Space$(80)
lngKeyLen = Len(strKeyName)

'枚举key
lngEnumRet = RegEnumKeyEx(lnghSubKey, _
lngKeyCnt, _
strKeyName, _
lngKeyLen, _
ByVal 0&, _
vbNullString, _
ByVal 0&, _
udtFileTime)
If lngEnumRet <> ERROR_SUCCESS Then Exit Do

'更新输出的数组
ReDim Preserve strEnumKeyArray(lngKeyCnt) As String

'strKeyName为指定索引处项名的一个缓冲区
strEnumKeyArray(lngKeyCnt) = Left(strKeyName, InStr(1, strKeyName, vbNullChar) - 1)

'获取下一个子项,第一个子项的索引编号为零
lngKeyCnt = lngKeyCnt + 1
Loop
zyl910 2002-09-12
  • 打赏
  • 举报
回复
http://www.sqreg.com/file/vb/reg_07.htm




下面的一个子函数可以在WinNt下递归删除某个Key和它下面的所有SubKey.


Function DeleteSubkeyTree(ByVal hKey As Long, ByVal Subkey As String) As Boolean
Dim ret As Long, Index As Long, Name As String
Dim hSubKey As Long
ret = RegOpenKey(hKey, Subkey, hSubKey)
If ret <> 0 Then
DeleteSubkeyTree = False
Exit Function
End If
ret = RegDeleteKey(hSubKey, "")
If ret <> 0 Then
Name=String(256,chr(0))
If ret <> 0 Then
'RegDeleteKey无法删除,用于Winnt下。
Name = String(256, Chr(0))
While RegEnumKey(hSubkey, 0, Name, Len(Name)) = 0 And DeleteSubkeyTree(hSubkey, Name)
'递归删除Subkey的Subkey
Wend
ret = RegDeleteKey(hSubkey, "")
End If
DeleteSubkeyTree = (ret = 0)
RegCloseKey hSubkey
End Function

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧