4040|5

63

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

使用RegEnumKeyEx()函数枚举组册表的疑问? [复制链接]

使用RegEnumKeyEx()函数枚举组册表,遇到问题,发现该命令是用由个键的“最后子键”向上枚举...
例子如下

  1. BOOL CCameratestDlg::FineCISDevice()
  2. {
  3.         HKEY hKey_tmp = NULL;
  4.         HKEY hKey = NULL;
  5.         TCHAR comNum[10];
  6.         TCHAR achKey[10];
  7.         CString comname,sActive,temp;

  8.         DWORD i = 0;
  9.         DWORD cbMaxSubKey = 10;        //键名的长度
  10.         DWORD dwType = 10;
  11.         DWORD dwSize = 10;
  12.         sActive = _T("Drivers\\Active\");        //注册表下已加载设备项

  13.         RegOpenKeyEx(HKEY_LOCAL_MACHINE,sActive,0,0,&hKey);        //打开指定的键并把句柄复制给hKey

  14.         temp.Format(_T("%d"),i);                //提示输出
  15.         AfxMessageBox(temp);                        //提示输出
  16.         AfxMessageBox(_T("开始读取子键值!"));
  17.        
  18.         //列举HKEY_LOCAL_MACHINE\Drivers\Active下的子键XX并赋值给achKey
  19.         while (RegEnumKeyEx(hKey, i, achKey, &cbMaxSubKey, NULL, NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS/*ERROR_SUCCESS*/)
  20.         {
  21.                 temp.Format(_T("%d"),i);                //提示输出
  22.                 AfxMessageBox(temp);                        //提示输出
  23.                
  24.                 //打开Drivers\Active\XX子键并赋值给hKey_tmp
  25.                 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, sActive+achKey, 0, 0, &hKey_tmp) == ERROR_SUCCESS)
  26.                 {        //读取指定键的的name值
  27.                         if(RegQueryValueEx(hKey_tmp, _T("name"), NULL, &dwType, (BYTE *)&comNum, &dwSize) == ERROR_SUCCESS)
  28.                         {
  29.                                 comname.Format(L"%s",comNum);
  30.                                 AfxMessageBox(comname);                        //提示输出

  31.                                 if(comname.Left(3) == L"CIS")
  32.                                 {
  33.                                         temp.Format(_T("%d"),i);
  34.                                         AfxMessageBox(temp);
  35.                                         AfxMessageBox(_T("摄像头驱动已加载!"));
  36.                                         RegCloseKey(hKey_tmp);
  37.                                         RegCloseKey(hKey);
  38.                                         return TRUE;
  39.                                 }                       
  40.                         }
  41.                         RegCloseKey(hKey_tmp);
  42.                 }
  43.                 ZeroMemory(achKey,10);
  44.                 cbMaxSubKey = 10;
  45.                 i++;
  46.         }
  47.         RegCloseKey(hKey);
  48.         temp.Format(_T("%d"),i);
  49.         AfxMessageBox(temp);
  50.         AfxMessageBox(_T("摄像头驱动没有加载!"));
  51.         return FALSE;
  52. }

复制代码


问题是:
    RegEnumKeyEx(hKey, i, achKey, &cbMaxSubKey, NULL, NULL, NULL, NULL)函数中i的初始值为0,依次枚举Drivers\Active\XX子键,
    运行结果发现:该命令是用由Drivers\Active\键的“最后子键”向上枚举,并且当i参数为0时,读取最有一个键“31”(见附图)时,未能读取其中的“Name”值的内容(实际上是有的,比如为K“EY1:”),然后从i为1时,可正常读取子键中“Name”值内容!!
    这样就会不能正确识别最新加载的驱动,如果是从最上头的子键(比如“01”子键)向下枚举的话,这个问题就无所谓;

   现在就想请教eeworld上的各位高人:
   第一:为啥RegEnumKeyEx()函数枚举组册表是用从某个键的“最后子键”向上枚举?
   第二:参数i为0是如何正确读取子键内容?

最新回复

结贴,给分!  详情 回复 发表于 2009-8-12 10:25
点赞 关注

回复
举报

73

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
运行结果发现:该命令是用由Drivers\Active\键的“最后子键”向上枚举:
举例:读取到子键“13”(见上图)时,i为15时。
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

http://www.yeeyan.com/articles/view/17986/5203

dwIndex

返回子键的索引.当第一次调用该函数时,此参数必须设为0,在尔后的调用中逐次增加.

由于子键是无序的,一个新的子键可能得到任意的索引.这个函数可能以任何顺序返回子键.


那看来枚举子键的顺序不就人为指定咯,
那第二个问题怎么解决么?
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

4
 
建议 LZ 将
DWORD dwSize = 10;
改成
DWORD dwSize = sizeof(comNum);
试试看吧

Paul, Chao @ Techware
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
大哥,你真神了!

我已按照你说的一改就好了!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(中级)

6
 
结贴,给分!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表