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

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
...全文
90 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
  • 打赏
  • 举报
回复
为什么总没人回答呢?很难吗?
【为什么要学习这门课程】深度学习框架如TensorFlow和Pytorch掩盖了深度学习底层实现方法,那能否能用Python代码从零实现来学习深度学习原理呢?本课程就为大家提供了这个可能,有助于深刻理解深度学习原理。左手原理、右手代码,双管齐下!本课程详细讲解深度学习原理并进行Python代码实现深度学习网络。课程内容涵盖感知机、多层感知机、卷积神经网络、循环神经网络,并使用Python 3及Numpy、Matplotlib从零实现上述神经网络。本课程还讲述了神经网络的训练方法与实践技巧,且开展了代码实践演示。课程对于核心内容讲解深入细致,如基于计算图理解反向传播算法,并用数学公式推导反向传播算法;另外还讲述了卷积加速方法im2col。【课程收获】本课程力求使学员通过深度学习原理、算法公式及Python代码的对照学习,摆脱框架而掌握深度学习底层实现原理与方法。本课程将给学员分享深度学习的Python实现代码。课程代码通过Jupyter Notebook演示,可在Windows、ubuntu等系统上运行,且不需GPU支持。【优惠说明】 课程正在优惠中!  备注:购课后可加入白勇老师课程学习交流QQ群:957519975【相关课程】学习本课程的前提是使用Python语言以及Numpy和Matplotlib库。相关课程链接如下:《Python编程的术与道:Python语言入门》https://edu.csdn.net/course/detail/27845《玩转Numpy计算库》https://edu.csdn.net/lecturer/board/28656《玩转Matplotlib数据绘图库》https://edu.csdn.net/lecturer/board/28720【课程内容导图及特色】

7,763

社区成员

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

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