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(" *[找到]#%d %s 设置兼容性为:%s "),i,subKey,szData);continue;}_tprintf_s(_T(" #%d %s 设置兼容性为:%s "),i,subKey,szData);}if (bFindCompat == false){_tprintf_s(_T(" %s 未设置兼容性 "),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, //保留值,强制0KEY_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]=' '; //该两行很重要,保证了每次循环的初始sizeSubKey=MAX_KEY_LENGTH; //第一行清空子键,第二行赋缓冲区大小RegEnumKeyEx( hKey, //键柄i, //子键序号subKey, //存入子键名&sizeSubKey,//指明缓冲区大小NULL,NULL,NULL,NULL);RegSearch (hKey,subKey,path+subKey+"\"); //递归}}}RegCloseKey(hKey); //收尾工作是一定要做的,否则机器会异常的慢}