使用Windows API 函数中的RegOpenKeyEx()函数和RegEnumKeyEx()函数来实现对注册表某项下的所有子项进行枚举。
1、RegOpenKeyEx 函数:
原形:LONG RegOpenKeyEx(
HKEY hKey, // 要打开主键名
LPCTSTR lpSubKey, // 需要打开的子键或路径
DWORD ulOptions, // 保留,为0
REGSAM samDesired, // 操作权限标志
PHKEY phkResult // 指向你打开键的句柄 (通过指针返回)
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS.
解释:该函数负责打开指定的键或子键,如果不存在他不建立。
查看官方文档:http://msdn.microsoft.com/zh-cn/aa912084
2、RegEnumKeyEx函数:
原形:LONG RegEnumKeyEx(
HKEY hKey, // 要列举的键的句柄
DWORD dwIndex, // 欲获取的子项的索引。第一个子项的索引编号为零
LPTSTR lpName, // 子键的名称
LPDWORD lpcbName, // 子键名称的长度
LPDWORD lpReserved, // 保留
LPTSTR lpClass, // address of buffer for class string
LPDWORD lpcbClass, // address for size of class buffer
PFILETIME lpftLastWriteTime
// address for time key last written to
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
返回注册表键及其子键的详细信息。
查看官方文档:http://msdn.microsoft.com/zh-cn/library/ms724862.aspx
示例代码:
/*
* 版权:
* 文件名称:RegEnumKey.c
* 摘要:枚举注册表下的所有子项
* 当前版本:
* 作者:烈风
* 完成日期:
*/
# include <stdio.h>
# include <Windows.h>
# include <tchar.h>
# include <locale.h>
int main(void)
{
_wsetlocale(LC_ALL, _T("")); //设置或检索本地运行环境,避免wprintf打印中文乱码
HKEY hKey = NULL; //保存注册表的句柄
DWORD dwIndexs = 0; //需要返回子项的索引
TCHAR keyName[MAX_PATH] = { 0 }; //保存子键的名称
DWORD charLength = 256; //想要读取多少字节并返回实际读取到的字符长度
TCHAR *subKey = _T("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
while (RegEnumKeyEx(hKey, dwIndexs, keyName, &charLength, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
wprintf(_T("%d : %s\n"), dwIndexs, keyName);
++dwIndexs;
charLength = 256;
}
}
if (hKey != NULL)
{
RegCloseKey(hKey);
}
system("pause");
return 0;
}