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