麻烦大家看一下,为什么我的代码会进入死循环?有没有办法解决?

yang8727 2003-08-20 03:33:08
代码如下



Private Function enumkey(subkey As String, zikey As String)
Dim hKey As Long, ret As Long, Name As String, idx As Long
idx = 0
Name = String(256, Chr(0))
Do
Select Case subkey
Case "HKEY_CURRENT_USER"
ret = RegOpenKey(HKEY_CURRENT_USER, zikey, hKey)
Case "HKEY_LOCAL_MACHINE"
ret = RegOpenKey(HKEY_LOCAL_MACHINE, zikey, hKey)
Case "HKEY_USERS"
ret = RegOpenKey(HKEY_USERS, zikey, hKey)
Case "HKEY_CLASSES_ROOT"
ret = RegOpenKey(HKEY_CLASSES_ROOT, zikey, hKey)
End Select
If ret = 0 Then
ret = RegEnumKey(hKey, idx, Name, Len(Name))
enumkey = Left(Name, InStr(Name, Chr(0)) - 1)
List1.AddItem enumkey
If Name = "" Then Exit Function
enumkey subkey, zikey + "\" + Name
Exit Do
End If
idx = idx + 1
Loop Until ret <> 0
RegCloseKey hKey
End Function
...全文
89 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yang8727 2003-08-21
  • 打赏
  • 举报
回复
谢谢大家,我自己解决了。
of123 2003-08-20
  • 打赏
  • 举报
回复
原来的故障是停留在一个子键上不断反复。
of123 2003-08-20
  • 打赏
  • 举报
回复
> 这句判断不对
> If Name = "" Then Exit Function
> name返回的是定长的字符串不足的用vbnullstring填充,所以即使name是空这个也不成立
> 其实楼主调试一下就明白了

其实楼主这里没有错,楼上大侠忽略了ret = RegEnumKey(hKey, idx, Name, Len(Name))会给Name重新赋值,包括空串。
其实楼上调试一下就明白了(不好意思,学舌了)
of123 2003-08-20
  • 打赏
  • 举报
回复
这样:(调试过了)
Private Sub enumkey(subkey As String, zikey As String)
Dim hKey As Long, ret As Long, Name As String, idx As Long, mKey As String
idx = 0
Name = String(256, Chr(0))
Do
Select Case subkey
Case "HKEY_CURRENT_USER"
ret = RegOpenKey(HKEY_CURRENT_USER, zikey, hKey)
Case "HKEY_LOCAL_MACHINE"
ret = RegOpenKey(HKEY_LOCAL_MACHINE, zikey, hKey)
Case "HKEY_USERS"
ret = RegOpenKey(HKEY_USERS, zikey, hKey)
Case "HKEY_CLASSES_ROOT"
ret = RegOpenKey(HKEY_CLASSES_ROOT, zikey, hKey)
End Select
If ret = 0 Then
ret = RegEnumKey(hKey, idx, Name, Len(Name))
mKey = Left(Name, InStr(Name, Chr(0)) - 1)
List1.AddItem mKey
If Name = "" Then Exit Sub
enumkey subkey, zikey + "\" + mKey
Exit Do
End If
idx = idx + 1
Loop Until ret <> 0
RegCloseKey hKey
End Sub
道素 2003-08-20
  • 打赏
  • 举报
回复
viena(晓琴)
你忽略楼主用了递归,加上If Name = "" Then Exit Function判断失误才造成死循环
道素 2003-08-20
  • 打赏
  • 举报
回复
If InStr(Name, Chr(0)) = 1 Then Exit Function
这是我想到的判断方法,你可以想想有没有更好的方法
viena 2003-08-20
  • 打赏
  • 举报
回复
If ret = 0 Then
……
Exit Do
End If

Loop Until ret <> 0
不管ret是否等于0,都会结束循环,循环根本就没有进行
道素 2003-08-20
  • 打赏
  • 举报
回复
这句判断不对
If Name = "" Then Exit Function
name返回的是定长的字符串不足的用vbnullstring填充,所以即使name是空这个也不成立
其实楼主调试一下就明白了
watt 2003-08-20
  • 打赏
  • 举报
回复
来晚了
道素 2003-08-20
  • 打赏
  • 举报
回复
楼主的意思是把注册表该建下的子建读出
我用实例说明吧,假如我读取
enumkey "HKEY_CURRENT_USER", "Console"
Console下已经没有子目录
你的程序这么运行
首先读HKEY_CURRENT_USER\Console 读到,返回0
然后读HKEY_CURRENT_USER\Console\(因为子目录名为空)
还是能返回0,然后继续读 HKEY_CURRENT_USER\Console\。。。。。死循环
可以加个判断

但是即使不死循环如果层次教多,也会累死计算机
江山易改 2003-08-20
  • 打赏
  • 举报
回复
因为无论如何你都不可能让ret = 0
of123 2003-08-20
  • 打赏
  • 举报
回复
你自己单步跟踪一下不就可以知道了吗?
  • 打赏
  • 举报
回复
你的代码太难看了(没有空格和Tab),建议整理一下再贴出来!
zjcxc 2003-08-20
  • 打赏
  • 举报
回复
循环的目的何在?好像没有必要加循环吗?
yang8727 2003-08-20
  • 打赏
  • 举报
回复
为什么总没人回答呢?很难吗?

7,762

社区成员

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

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