everyone 发表于 2009-4-14 23:28:57

RegDeleteKey不能删除多层Key的问题

<font face="Verdana" size="4">比如在HKEY_CURRENT_USER\MyK\下有多个SubKey,而且每个SubKey还有多层SubKey,用RegDeleteKey删除HKEY_CURRENT_USER\MyK\会返回非0。请问如何删除这个Key?<br/></font>
[此贴子已经被作者于2009-4-15 14:34:29编辑过]

everyone 发表于 2009-4-15 14:40:47

<p><font size="3">我也是用枚举,这是我的代码,代码有问题,会进入死循环,不知道怎么回事?最后也删不干净。</font></p>
<p><font size="3"></font>&nbsp;</p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp; Re = RegOpenKey(HKEY_CURRENT_USER, "MyK", Jub)<br/>&nbsp;&nbsp;&nbsp; Re = RegDeleteKey(Jub, "")</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp; If Re = ERROR_CANTWRITE Then</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Na = Space(255)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; While RegEnumKeyEx(Jub, 0, Na, 255, 0&amp;, vbNullString, ByVal 0&amp;, Ti) = 0 And _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegDeleteKey(Jub, Na) = 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wend</font></p>
<p><font face="Verdana" size="3">Xun:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegDeleteKey(Jub, "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegEnumKeyEx(Jub, 0, Na, 255, 0&amp;, vbNullString, ByVal 0&amp;, Ti)</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Re = ERROR_NO_MORE_ITEMS Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegDeleteKey(Jub, "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegDeleteKey(Jub, Na)</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Re = ERROR_CANTWRITE Then</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegOpenKey(Jub, Na, Jub)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GoTo Xun<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loop<br/>&nbsp;&nbsp;&nbsp; End If</font></p>
<p><font face="Verdana" size="3"></font>&nbsp;</p>
<p><font face="Verdana"><font size="3">弄得我都理不清该怎么写代码了。</font></p>
<p><br/></p></font>

everyone 发表于 2009-4-15 14:43:27

<p>糊涂了~</p>

马大哈 发表于 2009-4-15 16:50:37

我改一下这个注册表模块吧.

马大哈 发表于 2009-4-16 15:21:38

<div class="msgheader">QUOTE:</div><div class="msgborder"><b>以下是引用<i>everyone</i>在2009-4-15 14:40:47的发言:</b><br/>
<p><font size="3">我也是用枚举,这是我的代码,代码有问题,会进入死循环,不知道怎么回事?最后也删不干净。</font></p>
<p><font size="3"></font>&nbsp;</p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp; Re = RegOpenKey(HKEY_CURRENT_USER, "MyK", Jub)<br/>&nbsp;&nbsp;&nbsp; Re = RegDeleteKey(Jub, "")</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp; If Re = ERROR_CANTWRITE Then</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Na = Space(255)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Do</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; While RegEnumKeyEx(Jub, 0, Na, 255, 0&amp;, vbNullString, ByVal 0&amp;, Ti) = 0 And _<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegDeleteKey(Jub, Na) = 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wend</font></p>
<p><font face="Verdana" size="3">Xun:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegDeleteKey(Jub, "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegEnumKeyEx(Jub, 0, Na, 255, 0&amp;, vbNullString, ByVal 0&amp;, Ti)</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Re = ERROR_NO_MORE_ITEMS Then<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegDeleteKey(Jub, "")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Do<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegDeleteKey(Jub, Na)</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Re = ERROR_CANTWRITE Then</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Re = RegOpenKey(Jub, Na, Jub)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GoTo Xun<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</font></p>
<p><font face="Verdana" size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Loop<br/>&nbsp;&nbsp;&nbsp; End If</font></p>
<p><font face="Verdana" size="3"></font>&nbsp;</p>
<p><font face="Verdana"><font size="3">弄得我都理不清该怎么写代码了。</font></p>
<p><br/></p></font></div>
<p>你的枚举貌似没有组成递归结构.</p>
<p>&nbsp;</p>
<p>你可以参考一下我的代码:</p>
<p>&nbsp;</p>
<p><font face="Verdana"><a href="http://www.m5home.com/bbs/viewthread.php?tid=422&extra=&page=1">http://www.m5home.com/bbs/viewthread.php?tid=422&extra=&page=1</a></font></p>
<p>&nbsp;</p>
<p>我增加了递归删除功能.</p>

everyone 发表于 2009-4-16 21:00:15

多谢老马!!!

everyone 发表于 2009-4-15 11:22:58

好像老马的那个注册表操作模块也不能删除多层Key

马大哈 发表于 2009-4-15 14:34:55

<p>貌似本身这个API没有删除整键的功能.</p>
<p>&nbsp;</p>
<p>你可以配合RegEnumKeyEx来实现递归删除.</p>
<p>&nbsp;</p>
<p>把一个KEY下面所有的键都列出来,再一个一个删除,最后再把当前键删除.</p>
页: [1]
查看完整版本: RegDeleteKey不能删除多层Key的问题