C++枚举注册表键值和注册表项的函数

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;
  • 标签
  • 发表评论
当前用户:
  • 评论列表