C++枚举注册表键值和注册表项的函数,最近有用到,在这里做个记录,也给有需要的人。
函数代码
list<CString> enumSubKeys(HKEY key, CString subKey) { list<CString> list; HKEY hKey; LONG ret; ret = RegOpenKeyEx(key, subKey, 0, KEY_ALL_ACCESS, &hKey); //注意权限使用所有权限 if (ret != ERROR_SUCCESS) { //注册表打开失败 AfxMessageBox(L"错误:无法打开有关的hKEY"); return list; } //////////////////////枚举注册表的子键///////////////////////////// DWORD dwIndex = 0; //子键的索引序号 TCHAR szSubKey[MAX_PATH] = _T(""); //接收子键名称的缓冲区 DWORD dwNameLen = MAX_PATH; while (ERROR_SUCCESS == RegEnumKeyEx(hKey, dwIndex, szSubKey, &dwNameLen, NULL, NULL, NULL, NULL)) { //开始枚举注册表的所有子键信息 CString str; str.Format(_T("%s"), szSubKey); list.push_back(szSubKey); dwNameLen = MAX_PATH; ++dwIndex; } RegCloseKey(hKey); return list; } map<CString, CString> enumSubValues(HKEY key, CString subKey) { map<CString, CString> kv; HKEY hKey; LONG ret0 = RegOpenKeyEx(key, subKey, 0, KEY_READ, &hKey); if (ret0 != ERROR_SUCCESS) { AfxMessageBox(L"错误:无法打开有关的hKEY"); return kv; } DWORD dwIndex = 0; while (1) { LONG Status; CHAR Name[MAX_PATH] = { 0 }; UCHAR szPortName[MAX_PATH] = { 0 }; DWORD dwName; DWORD dwSizeofPortName; DWORD Type; dwName = sizeof(Name); dwSizeofPortName = sizeof(szPortName); Status = RegEnumValue(hKey, dwIndex++, (LPWSTR)Name, &dwName, NULL, &Type, szPortName, &dwSizeofPortName); if ((Status == ERROR_SUCCESS) || (Status == ERROR_MORE_DATA)) { CString k, v; k.Format(_T("%s"), Name); v.Format(_T("%s"), szPortName); kv[k] = v; dwName = sizeof(Name); dwSizeofPortName = sizeof(szPortName); } else { break; } } RegCloseKey(hKey); return kv; }
调用示例
// 调用 list<CString> items = enumSubKeys(HKEY_LOCAL_MACHINE, _T("SYSTEM\\ControlSet001\\Control\\GraphicsDrivers\\Configuration")); // 枚举 list<CString>::iterator p = items.begin(); while (p != items.end()) { // *p就是值了 p++; }
头文件
#include <list> #include <map> using namespace std;