使用Windows API 函数中的RegOpenKeyEx()函数和RegEnumValue()函数来实现对注册表某项下的所有键值进行枚举。
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、RegEnumValue函数:
原形:LONG RegEnumValue(
HKEY hKey, // 要查询的已打开的键的句柄
DWORD dwIndex, // 读取名称的索引号
LPTSTR lpValueName, // 返回所读取的键的名称
LPDWORD lpcbValueName, // 返回读取名称的长度,不含chr(0)
LPDWORD lpReserved, // 保留,为0
LPDWORD lpType, // 返回所读取的数据类型
LPBYTE lpData, // 返回所读取的键的值数据
LPDWORD lpcbData // 返回所读取的数据长度
);
返回值:不成功返回非0,成功返回ERROR_SUCCESS
解释:列出某Key的所有名称的值,变化索引即可遍历整个键下的名称和数据。
查看微软官方文档:http://msdn.microsoft.com/zh-cn/aa914418
代码示例:
# include <stdio.h>
# include <tchar.h>
# include <Windows.h>
# include <locale.h>
int main(void)
{
_wsetlocale(LC_ALL, _T(""));
HKEY hKey = NULL; //保存打开注册表的句柄
TCHAR *subKey = _T("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\2345PCSafe"); //需要打开的注册表子项
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
{
DWORD dwIndex = 0; // 注册表项的键值索引
TCHAR valueName[MAX_PATH] = { 0 }; //保存项下键的名称
DWORD length = MAX_PATH; // 保存返回读取的字符长度
BYTE keyData[MAX_PATH] = { 0 }; //保存键的值
DWORD lengthData = MAX_PATH; //保存值得长度
DWORD dwType = REG_SZ; //键值的类型
while (RegEnumValue(hKey, dwIndex, valueName, &length, 0, &dwType, keyData, &lengthData) == ERROR_SUCCESS)
{
wprintf(_T("%ld : 键值名称:%s ,键值类型:%lu,键值:%s\n"), dwIndex, valueName, dwType, keyData);
dwIndex++;
length = MAX_PATH;
lengthData = MAX_PATH;
}
}
else
{
wprintf(_T("false"));
}
if (hKey != NULL)
{
RegCloseKey(hKey);
}
getchar();
return 0;
}