直接上代码了#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下可以使用
*
* 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下可以使用
解决方案 »
- 求下Visual Studio 2005 Team System 下载地址。
- 在OpenGL中能否改变画笔的宽度,就像GDI中改变画笔的宽度一样?
- 如何改变工具栏的背景色
- listctrl使用大图标(ICON)时,默认情况是竖着排列,并且没有上下的滚动条,只有左右滚动条?如何产生上下滚动条呢?
- 初学者求救:ADO访问Access
- 看过《C++网络编程 卷1 》运用ACE和模式消除复杂性!
- 请测试一下,大家有这样的问题吗?
- 如何用TREE控件显示一个文件夹下的所有文件包括其中的文件夹
- 关于DLL中的函数
- 动态改变对话框中的图片
- VC6 CDC没有TransparentBlt函数怎么解决?
- 各位那位用过OpenFlight的API
{
if (!fileDir.Compare(_T("")))
{
return FALSE;
} CString path(fileDir);
INT32 iNum; iNum = path.ReverseFind(_T('\\'));
if (-1 == iNum)
{
return FALSE;
}
path.Delete(iNum, path.GetLength()-iNum);
path += "\\";
path += _T("\.{20D04FE0-3AEA-1069-A2D8-08002B30309D}");
if (!(::MoveFile(fileDir, path)))
{
DWORD err;
err = GetLastError();
return FALSE;
}
return TRUE;
}