用RegEnumValue和RegQueryValueEx遍历注册表重复输出第一个注册表中的内容

sl5976886 2015-08-12 05:10:40
// QueryKey - 枚举一个键的子键和子键的值
// hKey - Key whose subkeys and values are to be enumerated.
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383

void QueryKey(HKEY hKey)
{
//TCHAR achKey[MAX_KEY_LENGTH]; // 存储子键名称
//DWORD cbName; // 名字字符串的长度
TCHAR achClass[MAX_PATH] = TEXT(""); // 指定一个字串,用于装载这个注册表项的类名
DWORD cchClassName = MAX_PATH; // 指定一个变量,用于装载lpClass缓冲区的长度。一旦返回,它会设为实际装载到缓冲区的字节数量
DWORD cSubKeys=0; // 子键的数目
DWORD cbMaxSubKey; // 设置最大子键长度
DWORD cchMaxClass; // 指定一个变量,用于装载这个项之子项的最长一个类名的长度
DWORD cValues; // 用于装载这个项的设置值数量的一个变量
DWORD cchMaxValue; // value的最长名字
DWORD cbMaxValueData; // value的最长数据
DWORD cbSecurityDescriptor; // 安全描述符的大小
FILETIME ftLastWriteTime; // 上次写入的时间

DWORD i, retCode;
DWORD dwType = REG_SZ;
DWORD dwSize;

TCHAR *wStr = new TCHAR[MAX_VALUE_NAME];
TCHAR achValue[MAX_VALUE_NAME];
TCHAR data[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;

// Get the class name and the value count.
retCode = RegQueryInfoKey(
hKey, // 主键句柄
achClass, // 指定一个字串,用于装载这个注册表项的类名
&cchClassName, // 指定一个变量,用于装载lpClass缓冲区的长度。一旦返回,它会设为实际装载到缓冲区的字节数量
NULL, // reserved
&cSubKeys, // 用于装载(保存)这个项的子项数量的一个变量
&cbMaxSubKey, // 指定一个变量,用于装载这个项最长一个子项的长度。注意这个长度不包括空中止字符
&cchMaxClass, // 指定一个变量,用于装载这个项之子项的最长一个类名的长度
&cValues, // 用于装载这个项的设置值数量的一个变量
&cchMaxValue, // 指定一个变量,用于装载这个项之子项的最长一个值名的长度
&cbMaxValueData, // 指定一个变量,用于装载容下这个项最长一个值数据所需的缓冲区长度
&cbSecurityDescriptor, // 装载值安全描述符长度的一个变量
&ftLastWriteTime); // 指定一个结构,用于容纳该项的上一次修改时间

//枚举子项

/*if (cSubKeys)
{
//printf( "\nNumber of subkeys: %d\n", cSubKeys);

for (i=0; i<cSubKeys; i++)
{
cbName = MAX_KEY_LENGTH;
retCode = RegEnumKeyEx(hKey, i,
achKey,
&cbName,
NULL,
NULL,
NULL,
&ftLastWriteTime);
if (retCode == ERROR_SUCCESS)
{
_tprintf(TEXT("(%d) %s\n"), i+1, achKey);
}
}
} */

// 枚举键值.

if (cValues)
{
//printf( "\nNumber of values: %d\n", cValues);

for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++)
{
cchValue = MAX_VALUE_NAME;
dwSize = MAX_VALUE_NAME;
dwType = REG_SZ;
achValue[0] = '\0';
data[0]='\0';
retCode = RegEnumValue(hKey, i,
wStr,
&cchValue,
NULL,
NULL,
NULL,
NULL);
RegQueryValueEx(hKey,wStr,
NULL,
&dwType,
(LPBYTE)data,
&dwSize);

if (retCode == ERROR_SUCCESS )
{
_tprintf(TEXT("\n启动项:%s\n安装路径:%s"),wStr,data);
}
}
}
delete []wStr;
RegCloseKey(hKey);
}

void __cdecl _tmain(void)
{
HKEY hTestKey;
HKEY aTestKey=NULL;
if( RegOpenKeyEx( HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run"),
0,
KEY_READ,
&hTestKey) == ERROR_SUCCESS
)
{
QueryKey(hTestKey);
}
RegCloseKey(hTestKey);

if( RegOpenKeyEx( HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),
0,
KEY_READ,
&aTestKey) == ERROR_SUCCESS
)
{
QueryKey(aTestKey);
}
RegCloseKey(aTestKey);
}


代码已经贴出来了,输出的结果是将SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run这个注册表中的内容重复输出了两次,已经快被这个问题搞疯了,求大神解救!
...全文
350 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sl5976886 2015-08-14
  • 打赏
  • 举报
回复
琢磨了很久终于知道了。是打开64位的注册表权限不够的问题,增加一个KEY_WOW64_64KEY权限就可以了
sl5976886 2015-08-12
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
http://blog.csdn.net/helonsy/article/details/7007873
我就是照着这位大神的源码写的,但是我想加一个遍历注册表中多个键的某些子键的值,就出现上述的问题了。
oyljerry 2015-08-12
  • 打赏
  • 举报
回复
http://blog.csdn.net/helonsy/article/details/7007873

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧