|
使用RegEnumKeyEx()函数枚举组册表的疑问?
[复制链接]
使用RegEnumKeyEx()函数枚举组册表,遇到问题,发现该命令是用由个键的“最后子键”向上枚举...
例子如下
- BOOL CCameratestDlg::FineCISDevice()
- {
- HKEY hKey_tmp = NULL;
- HKEY hKey = NULL;
- TCHAR comNum[10];
- TCHAR achKey[10];
- CString comname,sActive,temp;
- DWORD i = 0;
- DWORD cbMaxSubKey = 10; //键名的长度
- DWORD dwType = 10;
- DWORD dwSize = 10;
- sActive = _T("Drivers\\Active\"); //注册表下已加载设备项
- RegOpenKeyEx(HKEY_LOCAL_MACHINE,sActive,0,0,&hKey); //打开指定的键并把句柄复制给hKey
- temp.Format(_T("%d"),i); //提示输出
- AfxMessageBox(temp); //提示输出
- AfxMessageBox(_T("开始读取子键值!"));
-
- //列举HKEY_LOCAL_MACHINE\Drivers\Active下的子键XX并赋值给achKey
- while (RegEnumKeyEx(hKey, i, achKey, &cbMaxSubKey, NULL, NULL, NULL, NULL) != ERROR_NO_MORE_ITEMS/*ERROR_SUCCESS*/)
- {
- temp.Format(_T("%d"),i); //提示输出
- AfxMessageBox(temp); //提示输出
-
- //打开Drivers\Active\XX子键并赋值给hKey_tmp
- if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, sActive+achKey, 0, 0, &hKey_tmp) == ERROR_SUCCESS)
- { //读取指定键的的name值
- if(RegQueryValueEx(hKey_tmp, _T("name"), NULL, &dwType, (BYTE *)&comNum, &dwSize) == ERROR_SUCCESS)
- {
- comname.Format(L"%s",comNum);
- AfxMessageBox(comname); //提示输出
- if(comname.Left(3) == L"CIS")
- {
- temp.Format(_T("%d"),i);
- AfxMessageBox(temp);
- AfxMessageBox(_T("摄像头驱动已加载!"));
- RegCloseKey(hKey_tmp);
- RegCloseKey(hKey);
- return TRUE;
- }
- }
- RegCloseKey(hKey_tmp);
- }
- ZeroMemory(achKey,10);
- cbMaxSubKey = 10;
- i++;
- }
- RegCloseKey(hKey);
- temp.Format(_T("%d"),i);
- AfxMessageBox(temp);
- AfxMessageBox(_T("摄像头驱动没有加载!"));
- return FALSE;
- }
复制代码
问题是:
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是如何正确读取子键内容?
|
|