删除注册表项及其子项

时间:2022-02-13 20:26:14
我要删除一个项,及其子项,在知道其子项名称时。我可以删除了他们。我可以先删除子项里的字符串,再删除子项,再删除项。如,有一个项ABC其子项是DEF,里面的字符串是"启动.exe"。那我可以先删除"启动.exe"。再删除DEF,再删除ABC。我要如何才能做到。只要删除ABC就可以整个删除ABCT和 DEF和"启动.exe"。而不用一个一个删除呢。我用的是下面的方法

Private Sub Form_Load()

Set Reg = CreateObject("Wscript.shell")
Reg.RegDelete("HKEY_LOCAL_MACHINE, "SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN\ABC\DEF\启动.exe")
RegDeleteKey"HKEY_LOCAL_MACHINE, "SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN\ABC\DEF" 
RegDeleteKey"HKEY_LOCAL_MACHINE, "SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\RUN\ABC\"
Set Reg = Nothing
End Sub


Reg.RegDelete是删除字符串用的就是删除我这里的。启动.exe
RegDeleteKey是删除项目的。用这个就不能删除字符串了。
我应该用什么方法叉可以实现只要删除ABC就行了。高手帮忙

5 个解决方案

#1


你试试直接用API:
RegDeleteKey——删除Key或者SubKey

RegDeleteKeyEx():同RegDeleteKeyEx()
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long 

  参数:

   hKey:Key Handle

   lpSubKey:SubKey名称或者路径,若传入""[空字符串],表示删除Key本身。

   返回值: =0,表示成功;≠0,表示失败。 

  示例

Dim hKey,ret As Long 
ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt\xiaoyuer", hKey) 
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt", hKey)
ret = RegDeleteKey(hKey, "xiaoyuer")'删除HKEY_LOCAL_MACHINE\SOFTWARE\Hongqt\xiaoyuer 

  注意: 

  如果我们利用RegDeleteKey函数删除一个含有SubKey的Key时,对于Windows98和Winnt来讲是不一样的。比如我们把上面的删除调用改成ret = RegDeleteKey(hKey, ""),则在windows98下,它会连hongqt下的xiaoyuer一起删除,而在winnt下则会报错。


如果不行则要用:
RegEnumKey——列出某Key的所有SubKey

  RegEnumKeyEx():返回注册表键及其子键的详细信息。

Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long  

  参数说明:

   hKey:Key Handle

   dwIndex:欲读取的SubKey的顺序

   lpName:返回所读取的SubKey的名称

   cbName:传入lpName的字符串长度。

   返回值: =0,表示成功;≠0,表示失败。

  示例:

Dim hKey As Long, ret As Long, Name As String, Idx As Long 
List1.Clear 
Idx = 0 
Name = String(256, Chr(0)) 
Do 
ret = RegEnumKey(HKEY_CURRENT_USER, Idx, Name, Len(Name)) 
If ret = 0 Then 
List1.AddItem Left(Name, InStr(Name, Chr(0)) - 1) 
Idx = Idx + 1 
End If 
Loop Until ret <> 0  

RegDeleteValue——删除某Key的某一名称
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long  

  参数:

   hKey:Key Handle

   lpValueName: Value名称,如果想删除默认值的话,传入""[空字符串]即可。 

   返回值: =0,表示成功;≠0,表示失败。

  示例:

    '我们假设在HKEY_CURRENT_USER\Software\SetValue有:
'预设值——VB操作注册表
'str1——我爱我的祖国
'我们要删除这两个Value 
ret = RegOpenKey(HKEY_CURRENT_USER, "Software\SetValue", hKey) 
If ret = 0 Then 
RegDeleteValue hKey, "Str1" 
MsgBox "已删除HKCU\Software\SetValueSubKeyStr1Value" 
RegDeleteValue hKey, "" 
MsgBox "已删除HKCU\Software\SetValueSubKey‘预设值’" 
End If 

最后调RegDeleteKey

#2


好像还是删除不了。我再试试。

#3


临时生成一个reg进行导入操作 可以直接把目录删掉

#4


那这样。就又涉及到新建设一个注册表项,然后还要生成。那这样就又太麻烦了。又会产生新的问题了。不能直接删除了吗。没其他好办法了吗?

#5


没遇到过这种情况.

#1


你试试直接用API:
RegDeleteKey——删除Key或者SubKey

RegDeleteKeyEx():同RegDeleteKeyEx()
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long 

  参数:

   hKey:Key Handle

   lpSubKey:SubKey名称或者路径,若传入""[空字符串],表示删除Key本身。

   返回值: =0,表示成功;≠0,表示失败。 

  示例

Dim hKey,ret As Long 
ret = RegCreateKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt\xiaoyuer", hKey) 
ret = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\Hongqt", hKey)
ret = RegDeleteKey(hKey, "xiaoyuer")'删除HKEY_LOCAL_MACHINE\SOFTWARE\Hongqt\xiaoyuer 

  注意: 

  如果我们利用RegDeleteKey函数删除一个含有SubKey的Key时,对于Windows98和Winnt来讲是不一样的。比如我们把上面的删除调用改成ret = RegDeleteKey(hKey, ""),则在windows98下,它会连hongqt下的xiaoyuer一起删除,而在winnt下则会报错。


如果不行则要用:
RegEnumKey——列出某Key的所有SubKey

  RegEnumKeyEx():返回注册表键及其子键的详细信息。

Declare Function RegEnumKey Lib "advapi32.dll" Alias "RegEnumKeyA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, ByVal cbName As Long) As Long  

  参数说明:

   hKey:Key Handle

   dwIndex:欲读取的SubKey的顺序

   lpName:返回所读取的SubKey的名称

   cbName:传入lpName的字符串长度。

   返回值: =0,表示成功;≠0,表示失败。

  示例:

Dim hKey As Long, ret As Long, Name As String, Idx As Long 
List1.Clear 
Idx = 0 
Name = String(256, Chr(0)) 
Do 
ret = RegEnumKey(HKEY_CURRENT_USER, Idx, Name, Len(Name)) 
If ret = 0 Then 
List1.AddItem Left(Name, InStr(Name, Chr(0)) - 1) 
Idx = Idx + 1 
End If 
Loop Until ret <> 0  

RegDeleteValue——删除某Key的某一名称
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long  

  参数:

   hKey:Key Handle

   lpValueName: Value名称,如果想删除默认值的话,传入""[空字符串]即可。 

   返回值: =0,表示成功;≠0,表示失败。

  示例:

    '我们假设在HKEY_CURRENT_USER\Software\SetValue有:
'预设值——VB操作注册表
'str1——我爱我的祖国
'我们要删除这两个Value 
ret = RegOpenKey(HKEY_CURRENT_USER, "Software\SetValue", hKey) 
If ret = 0 Then 
RegDeleteValue hKey, "Str1" 
MsgBox "已删除HKCU\Software\SetValueSubKeyStr1Value" 
RegDeleteValue hKey, "" 
MsgBox "已删除HKCU\Software\SetValueSubKey‘预设值’" 
End If 

最后调RegDeleteKey

#2


好像还是删除不了。我再试试。

#3


临时生成一个reg进行导入操作 可以直接把目录删掉

#4


那这样。就又涉及到新建设一个注册表项,然后还要生成。那这样就又太麻烦了。又会产生新的问题了。不能直接删除了吗。没其他好办法了吗?

#5


没遇到过这种情况.