直接上代码了#include <vector>using namespace std;/*  遍历注册表
*
*   parament: mainKey   要查询的主键
*             lpKeyName 子键
*             strFind   关键字
*   return:   成功 ERROR_SUCCESS   失败 其他
*   
*   注:结果保存在vFind中,保存值为 <子键,绝对路径>
*/
LONG RegSearch(HKEY mainKey, LPCTSTR lpKeyName,CString strFind)
{
LONG lRet;
HKEY hKey;               // 循环键值
CString path;            // 保存相对路径
std::vector<pair<HKEY, CString>> vFind;    // 保存结果
std::vector<pair<HKEY, CString>> vTmp;     // 保存待查询 //以下为调试用
std::vector<pair<HKEY, CString>> vView; 
std::vector<pair<HKEY, CString>> vErr; //确保mainKey不为空
if (NULL == mainKey)
{
mainKey = HKEY_CURRENT_USER;
} hKey = mainKey;
path = lpKeyName; pair<HKEY, CString> pTmp; pTmp.first  = NULL;
pTmp.second = _T("");
vTmp.push_back(pTmp); do 
{
lRet = RegOpenKeyEx(mainKey, path, NULL, KEY_READ, &hKey);
if (lRet != ERROR_SUCCESS)
{
lRet = GetLastError();
OFW_Log(lRet);
if (!vTmp.empty())
{
vErr.push_back(vView.back());
vView.pop_back(); hKey = vTmp.back().first;
path = vTmp.back().second;
vTmp.pop_back();
continue;
} return ERROR_REGISTER_OPEN;
}

if (RegQueryValueEx(hKey, strFind, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
pTmp.first  = hKey;
pTmp.second = path;
vFind.push_back(pTmp);
} DWORD numSubKey; //查询当前键下的子键项数
RegQueryInfoKey(hKey, 
NULL,
NULL,
NULL,
&numSubKey,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL); if (numSubKey)
{
DWORD i;
for (i = 0; i < numSubKey; i++)
{
TCHAR  subKey[MAX_KEY_LENGTH] = _T("");
DWORD  subKeySize = MAX_KEY_LENGTH; RegEnumKeyEx(hKey,
i,
subKey,
&subKeySize,
NULL,
NULL,
NULL,
NULL);
pTmp.first  = hKey;
pTmp.second = path + subKey + _T('\\');
vTmp.push_back(pTmp);
}
} RegCloseKey(hKey); if (!vTmp.empty())
{

hKey = vTmp.back().first;
path = vTmp.back().second;
vView.push_back(vTmp.back());
vTmp.pop_back();
} } while (!vTmp.empty()); RegCloseKey(mainKey);
return ERROR_SUCCESS;
}void OFW_Log(DWORD err)
{
TCHAR * buf; ::FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
err,
0,
(LPTSTR)&buf,
0,
NULL);

LocalFree(buf);
}vs2010下可以使用