注册表的遍历和递归

1.遍历。用于查找某键(无子键)下面的所有值。以下示例了在Win7下查找所有设置了兼容性的程序:

int CompatDetect(PCTSTR szAppName)

{

	setlocale(LC_ALL,"");

	HKEY hk = NULL;

	LONG lRet=RegOpenKeyEx(HKEY_CURRENT_USER,

		_T("Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers"),

		NULL,KEY_READ|KEY_QUERY_VALUE,&hk);

	if(lRet==ERROR_SUCCESS && NULL!=hk)

	{		

		int i=0;

		bool bFindCompat = false;

		TCHAR subKey[MAX_PATH]={0};

		TCHAR szData[MAX_PATH]={0};

		for (;;++i)

		{

			ZeroMemory(subKey,sizeof(subKey));

			ZeroMemory(szData,sizeof(szData));

			DWORD sizeKey = _countof(subKey);

			DWORD szCbData = sizeof(szData);

			DWORD dwType = 0;

			lRet = RegEnumValue(hk,i,subKey,&sizeKey,NULL,&dwType,(LPBYTE)szData,&szCbData);

			if (lRet != ERROR_SUCCESS)

			{

				break;

			}

			wstring str(subKey);

			if (str.find(szAppName)!=str.npos)

			{

				bFindCompat = true;

				_tprintf_s(_T("\t*[找到]#%d %s 设置兼容性为:%s\n"),i,subKey,szData);

				continue;

			}

			_tprintf_s(_T("\t#%d %s 设置兼容性为:%s\n"),i,subKey,szData);

		}

		if (bFindCompat == false)

		{

			_tprintf_s(_T("\n %s 未设置兼容性\n"),szAppName);

		}

		RegCloseKey(hk);

	}

	return 1;

}

2.递归。用于遍历包含子键的键下面的所有值。以下示例参考:http://www.vckbase.com/Public/Uploads/attach/code/80/seekreg20.rar

void RegSearch(HKEY hKey, TCHAR rootKey[], CString path)

{

	DWORD	numSubKey=0;					//存放子键的项数

	DWORD	i;								//计数

	DWORD   sizeSubKey;						//子键大小

	TCHAR	subKey[MAX_KEY_LENGTH];			//子键名

	/*打开hKey中的rootKey, hKey乃继承递归调用者之hKey, rootKey乃递归调用者之subKey*/

	RegOpenKeyEx(	hKey,					//欲开之键柄

					rootKey,				//欲开之根键名

					0,						//保留值,强制0

					KEY_READ,				//权限

					&hKey);					//打开子键后,返回键柄

	/*首先查当前键下的值们(表明是复数哈)是否有符合条件的*/

	if (RegQueryValueEx(	hKey,			//欲开之键柄

							m_content,		//欲查询的值

							NULL,

							NULL,

							NULL,

							NULL)==ERROR_SUCCESS)

	{

		findFlag=1;							//在该键下,直接查找成功

		m_result=path;

		return;								//跳出递归

	}

	/*没有查到,则进入子键查询*/

	else

	{

		/*首先查得当前键下的子键项数*/

		RegQueryInfoKey(	hKey,

							NULL,

							NULL,

							NULL,

							&numSubKey,		//查得子键的项数

							NULL,

							NULL,

							NULL,

							NULL,

							NULL,

							NULL,

							NULL);

		

		/*如果子键数不为0,遍历子键*/

		if (numSubKey)	

		{

			for (i=0; i<numSubKey; i++)

			{

				subKey[0]='\0';				//该两行很重要,保证了每次循环的初始	

				sizeSubKey=MAX_KEY_LENGTH;	//第一行清空子键,第二行赋缓冲区大小

				RegEnumKeyEx(	hKey,		//键柄

								i,			//子键序号

								subKey,		//存入子键名

								&sizeSubKey,//指明缓冲区大小

								NULL,

								NULL,

								NULL,

								NULL);

				RegSearch (hKey,subKey,path+subKey+"\\");	//递归

			}

		}

	}

	RegCloseKey(hKey);						//收尾工作是一定要做的,否则机器会异常的慢

}

你可能感兴趣的:(注册表)