CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  API

请教REGENUMVALUE的问题

楼主sonic32(sonic32)2005-08-04 11:35:03 在 VB / API 提问

代码如下  
  Function   listvalue(keys)  
  Dim   x   As   Long,   i   As   Long,   dType   As   Long  
  rkey   =   Space(300)  
  'Dim   lkey   As   Long  
  Do   Until   x   <>   0  
  x   =   RegEnumValue(hkey,   i,   rkey,   300,   0,   dType,   0,   0)  
  Debug.Print   x  
                  If   x   =   0   Then   List2.AddItem   rkey  
                  i   =   i   +   1  
  Loop  
  End   Function  
   
  可以确定HKEY没有问题,因为REGENUMKEYEX还在使用,最后的REGCLOSEKEY使用HKEY也没有问题。  
  中间代码找不到问题所在。X的返回值总不是0,请教一下如何解决,问题何在,谢谢。 问题点数:100、回复次数:3Top

1 楼sonic32(sonic32)回复于 2005-08-04 11:40:08 得分 0

补充一下,X的返回值在HKEY=SOFTWARE下是234,在其他地方是259Top

2 楼sonic32(sonic32)回复于 2005-08-04 17:27:01 得分 0

怎么一下午都没人?加分到100Top

3 楼jxgzay(jxgzay)回复于 2005-08-04 17:59:54 得分 100

登录数据库Registry的Value的存取--读取某个Key下的所有名称的值(Value)  
  有时候我们需要读取某个Key下的所有名称的值,找到特定的或者全部名称的值以作它用  
  要用到的API函数RegEnumValue,其详细描述:  
  VB声明  
  Declare   Function   RegEnumValue   Lib   "advapi32.dll"   Alias   "RegEnumValueA"   (ByVal   hKey   As   Long,   ByVal   dwIndex   As   Long,   ByVal   lpValueName   As   String,   lpcbValueName   As   Long,   lpReserved   As   Long,   lpType   As   Long,   lpData   As   Byte,   lpcbData   As   Long)   As   Long    
  '以下的两个函数是经过改编过的函数,与此相关,也一并列出.并且在我们的例子程序中要用到它们。RegEnumValueAsAny可以传入长整数和字符串;RegEnumValueAsAny2中lpData参数被改成Any后,可以使用Byte数组,由于Byte数组是采用”传地址方式来传递参数的,可以省下复制字符串数据的时间,使得程序变得更加高效。  
  Declare   Function   RegEnumValueAsAny   Lib   "advapi32.dll"   Alias   "RegEnumValueA"   (ByVal   hKey   As   Long,   ByVal   dwIndex   As   Long,   ByVal   lpValueName   As   String,   lpcbValueName   As   Long,   lpReserved   As   Long,   lpType   As   Long,   lpData   As   Any,   lpcbData   As   Long)   As   Long    
   
  Declare   Function   RegEnumValueAsAny2   Lib   "advapi32.dll"   Alias   "RegEnumValueA"   (ByVal   hKey   As   Long,   ByVal   dwIndex   As   Long,   lpValueName   As   Any,   lpcbValueName   As   Long,   lpReserved   As   Long,   lpType   As   Long,   lpData   As   Any,   lpcbData   As   Long)   As   Long  
  参数说明:  
  hKey:Key   Handle  
  dwIndex:欲读取之名称的顺序  
  lpValueName:返回所读取的名称  
  lpcbValueName:传入lpValueName参数的长度,返回所读取的名称的长度,注意这一长度不含chr(0)  
  lpReserved:保留参数,实际使用时传入ByVal   0即可  
  lpType:返回所读取的数据类型  
  lpData:返回所读取的数据  
  lpcbData:传入lpData,返回所读取的数据长度  
  返回值:   =0,表示成功;≠0,表示失败。    
  调用例子:  
  ret=0  
  myindex=0  
  while   ret=0  
  ret=RegEnumValue(hkey,myindex,Name,ByVal   0,   typeData,   ByVal   vbNullString,   lenData)  
  myindex=myindex+1  
  wend    
  一个完整的例子如下:  
  '*************EnumVal2.bas***************  
  Option   Explicit    
  Public   Const    
  HKEY_CLASSES_ROOT   =   &H80000000    
  Public   Const   HKEY_CURRENT_USER   =   &H80000001    
  Public   Const   HKEY_LOCAL_MACHINE   =   &H80000002    
  Public   Const   HKEY_USERS   =   &H80000003    
  Public   Const   HKEY_PERFORMANCE_DATA   =   &H80000004    
  Public   Const   HKEY_CURRENT_CONFIG   =   &H80000005    
  Public   Const   HKEY_DYN_DATA   =   &H80000006    
   
  Public   Const   REG_NONE   =   0    
  Public   Const   REG_SZ   =   1    
  Public   Const   REG_EXPAND_SZ   =   2    
  Public   Const   REG_BINARY   =   3  
  Public   Const   REG_DWORD   =   4    
  Public   Const   REG_DWORD_BIG_ENDIAN   =   5    
  Public   Const   REG_MULTI_SZ   =   7    
  '注意以下的函数声明须在一行内写完  
  Declare   Function   RegOpenKey   Lib   "advapi32.dll"   Alias   "RegOpenKeyA"   (ByVal   hKey   As   Long,   ByVal   lpSubKey   As   String,   phkResult   As   Long)   As   Long   Declare   Function   RegCloseKey   Lib   "advapi32.dll"   (ByVal   hKey   As   Long)   As   Long    
   
  Declare   Function   RegQueryValue   Lib   "advapi32.dll"   Alias   "RegQueryValueA"   (ByVal   hKey   As   Long,   ByVal   lpSubKey   As   String,   ByVal   lpValue   As   String,   lpcbValue   As   Long)   As   Long    
   
  Declare   Function   RegQueryValueEx   Lib   "advapi32.dll"   Alias   "RegQueryValueExA"   (ByVal   hKey   As   Long,   ByVal   lpValueName   As   String,   ByVal   lpReserved   As   Long,   lpType   As   Long,   lpData   As   Any,   lpcbData   As   Long)   As   Long    
   
  Declare   Function   RegEnumValue   Lib   "advapi32.dll"   Alias   "RegEnumValueA"   (ByVal   hKey   As   Long,   ByVal   dwIndex   As   Long,   ByVal   lpValueName   As   String,   lpcbValueName   As   Long,   lpReserved   As   Long,   lpType   As   Long,   lpData   As   Byte,   lpcbData   As   Long)   As   Long    
   
  Declare   Function   RegEnumValueAsAny   Lib   "advapi32.dll"   Alias   "RegEnumValueA"   (ByVal   hKey   As   Long,   ByVal   dwIndex   As   Long,   ByVal   lpValueName   As   String,   lpcbValueName   As   Long,   lpReserved   As   Long,   lpType   As   Long,   lpData   As   Any,   lpcbData   As   Long)   As   Long    
   
  Declare   Function   RegEnumValueAsAny2   Lib   "advapi32.dll"   Alias   "RegEnumValueA"   (ByVal   hKey   As   Long,   ByVal   dwIndex   As   Long,   lpValueName   As   Any,   lpcbValueName   As   Long,   lpReserved   As   Long,   lpType   As   Long,   lpData   As   Any,   lpcbData   As   Long)   As   Long    
   
  Declare   Function   ExpandEnvironmentStrings   Lib   "kernel32"   Alias   "ExpandEnvironmentStringsA"   (ByVal   lpSrc   As   String,   ByVal   lpDst   As   String,   ByVal   nSize   As   Long)   As   Long    
   
  Sub   MultiStringToStringArray(S   As   String,   S2()   As   String)  
  'S为我们读取出来的多重字符串  
  'S2为转换后的字符串数组  
  Dim   count   As   Integer,   pos   As   Integer,   pos2   As   Integer,   idx   As   Integer    
  pos   =   InStr(S,   Chr(0))  
   
  While   pos   >   0   count   =   count   +   1    
  pos   =   InStr(pos   +   1,   S,   Chr(0))    
  Wend    
  '取得多重字符串中的字符串个数  
  count   =   count   -   1    
   
  ReDim   S2(0   To   count   -   1)    
  pos   =   1    
  For   idx   =   0   To   count   -   1    
  pos2   =   InStr(pos,   S,   Chr(0))    
  S2(idx)   =   Mid(S,   pos,   pos2   -   pos)    
  pos   =   pos2   +   1    
  Next    
  End   Sub  
  '在form中添加command按钮和text文本框  
  '************EnumVal2.frm****************  
  '以下的Command1_Click事件中我们将列举出'HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run下的所有name及其Value.  
  Private   Sub   Command1_Click()    
  Dim   hKey   As   Long,   ret   As   Long,   lenData   As   Long,   typeData   As   Long   Dim   Name   As   String  
  Dim   lenName   As   Long    
  Dim   idx   As   Integer,   j   As   Integer   Dim   bName(256)   As   Byte    
  ret   =   RegOpenKey(HKEY_LOCAL_MACHINE,   "Software\Microsoft\Windows\CurrentVersion\Run",   hKey)    
  If   ret   <>   0   Then   Exit   Sub    
   
  ret   =   0    
  idx   =   0    
  While   ret   =   0    
  lenName   =   256    
  ret=RegEnumValueAsAny2(hKey,idx,bName(0),lenName,ByVal   0,typeData,ByVal   vbNullString,   lenData)    
  If   ret   <>   0   Then    
  RegCloseKey   hKey    
  Exit   Sub    
  End   If    
  '上面的RegEnumValueAsAny2调用得到了第一个Name的长度lenName,不含chr(0)  
  Name   =   String(lenName   +   1,   Chr(0))    
  lenName   =   Len(Name)    
  Select   Case   typeData    
  Case   REG_SZ,   REG_EXPAND_SZ,   REG_MULTI_SZ    
  Dim   S   As   String    
  S   =   String(lenData,   Chr(0))    
  RegEnumValueAsAny   hKey,   idx,   Name,   lenName,   ByVal   0,   typeData,   ByVal   S,   lenData    
  If   typeData   =   REG_SZ   Then    
  S   =   Left(S,   InStr(S,   Chr(0))   -   1)    
  Text1.SelText=IIf(lenName=0,   "(预设值)",Left(Name,InStr(Name,Chr(0))-1))   &   "="   &   S   &   vbCrLf    
  ElseIf   typeData   =   REG_EXPAND_SZ   Then    
  Dim   S2   As   String    
  S2   =   String(Len(S)   +   256,   Chr(0))    
  ExpandEnvironmentStrings   S,   S2,   Len(S2)    
  S   =   Left(S2,   InStr(S2,   Chr(0))   -   1)    
  Text1.SelText   =   Left(Name,   InStr(Name,   Chr(0))   -   1)   &   "   =   "   &   S   &   vbCrLf    
  ElseIf   typeData   =   REG_MULTI_SZ   Then    
  Dim   SArr()   As   String    
  MultiStringToStringArray   S,   SArr    
  For   j   =   0   To   UBound(SArr)    
  Text1.SelText   =   Left(Name,   InStr(Name,   Chr(0))   -   1)   &   "("   &   j   &   ")   =   "   &   SArr(j)   &   vbCrLf    
  Next    
  End   If    
  Case   REG_DWORD,   REG_DWORD_BIG_ENDIAN    
  Dim   L   As   Long    
  RegEnumValueAsAny   hKey,   idx,   Name,   lenName,   ByVal   0,   typeData,   L,   lenData    
  Text1.SelText   =   Left(Name,   InStr(Name,   Chr(0))   -   1)   &   "   =   "   &   L   &   vbCrLf    
  Case   REG_BINARY    
  ReDim   bArr(0   To   lenData   -   1)   As   Byte    
  RegEnumValueAsAny   hKey,   idx,   Name,   lenName,   ByVal   0,   typeData,   bArr(0),   lenData    
  Text1.SelText   =   Left(Name,   InStr(Name,   Chr(0))   -   1)   &   "   =   "    
  For   j   =   0   To   UBound(bArr)    
  Text1.SelText   =   Hex(bArr(j))   &   "   "    
  Next    
  Text1.SelText   =   vbCrLf    
  End   Select    
  idx   =   idx   +   1    
  Wend    
  RegCloseKey   hKey    
  End   Sub  
  Top

相关问题

  • API:RegEnumValue???
  • RegEnumValue的问题~~
  • BCB中如何调用 RegEnumValue函数?
  • 请教:关于RegEnumValue取出的值名与注册表中不一致的问题。
  • 请各位大虾帮帮忙!怎样才能像RegEnumValue一样读取ini中的所有键值!
  • BYTE(unsigned char型如何转换为转换为 char型————关于注册表函数RegEnumValue()的一个参数
  • 哪位能给一个RegEnumValue()函数的例子,偶试了n遍总是出错

关键词

  • 函数
  • lenname
  • regenumvalueasany
  • regenumvalue
  • typedata
  • hkey
  • lendata
  • lpcbvaluename
  • byval
  • lpvaluename

得分解答快速导航

  • 帖主:sonic32
  • jxgzay

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo