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); //收尾工作是一定要做的,否则机器会异常的慢
}