用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这个注册表中的内容重复输出了两次,已经快被这个问题搞疯了,求大神解救!
...全文
471 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
【采用BPSK或GMSK的Turbo码】MSK、GMSK调制二比特差分解调、turbo+BPSK、turbo+GMSK研究(Matlab代码实现)【采用BPSK或GMSK的Turbo码】MSK、GMS内容概要:本文主要介绍了采用BPSK或GMSK调制方式的Turbo码相关技术研究,重点涵盖GMSK调制下的二比特差分解调方法、Turbo码与BPSK/GMSK调制相结合的系统性能分析,并提供了完整的Matlab代码实现方案。研究内容包括调制解调原理、编码结构设计、误码率仿真及系统优化等关键环节,旨在通过仿真手段验证所提出方案的有效性和可靠性,帮助研究人员深入理解现代数字通信系统的关键技术和其实现方法。; 适合人群:具备一定通信原理和Matlab编程基础,从事无线通信、信号处理、编码理论等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握GMSK调制与Turbo码结合的系统设计与仿真方法;②学习二比特差分解调算法在实际通信系统的应用;③通过Matlab代码实现提升对数字调制解调和信道编码技术的理解与实践能力;④为相关课题研究、毕业设计或工程项目提供参考和技术支持。; 阅读建议:建议读者结合文提供的Matlab代码逐模块运行与调试,对照通信系统基本原理深入理解各环节功能,重点关注调制解调过程与Turbo译码的协同工作机制,并尝试修改参数以观察系统性能变化,从而达到理论与实践相结合的学习效果。
代码转载自:https://pan.quark.cn/s/a4b39357ea24 LA 1010 逻辑分析仪被视作一种效能卓越的数字信号分析设备,其核心功能在于对数字通信协议,例如I²C,进行检测与解构。本资源将集阐述LA 1010的操作流程以及如何借助该设备对I²C协议的波形展开分析。 确保逻辑分析仪被正确地连接至目标系统是极为关键的环节。在运用LA 1010的过程,必须将分析仪的通道0与通道1分别对应连接至目标装置的SCL(时钟)与SDA(数据)线路。务必保证连接的稳固性且无任何干扰因素,以此确保数据采集的精确度。 随后,需要设定采样参数。采样频率对于能否成功捕捉到信号具有决定性的作用。针对I²C协议,通常选用的采样频率范围介于100kHz到400kHz之间,这一范围的选择取决于实际应用场景I²C总线的运行速度。然而,LA 1010所能达到的最高采样速率可能高达500MHz,因此需要根据具体需求进行相应的调整。此外,还必须精心挑选适配目标设备工作电压的电压等级,例如3.3V、5V或1.8V。 在软件操作层面,需要选取恰当的通道与协议种类,即I²C。一旦启动采样,逻辑分析仪便开始记录相关数据。软件界面通常会实时展示波形图,为观察与分析提供便利。 关于I²C协议波形的解读,我们可以遵循以下步骤: 1. 总线处于空闲状态时:SCL与SDA均维持在高电平位置,这表明总线当前未进行数据传输。 2. 传输起始信号:当SCL处于高电平期间,SDA线从高电平转换至低电平,此动作标志着数据传输的开始。 3. 地址、数据及应答的识别:在每一个SCL高电平脉冲的持续时间内,SDA线上的电平状态代表了数据位。地址与数据的传输均为双向过程,而读写标识则由SDA线上的电平来...
下载代码方式:https://pan.quark.cn/s/a4b39357ea24 在当前文档,我们将详细研究在C#开发平台借助BouncyCastle.Crypto库1.8.10版本达成国的国家标准密码学方案,涵盖SM2、SM3以及SM4这几项技术。这些密码学方案在国网络安全保障与数据维护领域具有核心地位,为本地化安全解决方案提供了坚实的技术支撑。 让我们首先掌握这三个国家密码算法的基本原理: 1. **SM2算法**:SM2是一种基于椭圆曲线密码体系(ECC)的公钥加密方案,主要用于数字签名和加密操作。它提供了一种高效且安全的身份确认和数据防护机制。 2. **SM3算法**:SM3是一种密码学哈希函数,与SHA-256类似,能够将任意长度的输入信息压缩为固定长度的摘要,常用于数据完整性的检验和确认。 3. **SM4算法**:SM4是一种分组密码方案,采用128位的分组大小和128位的密钥,适用于对称加密,广泛用于无线网络传输和存储数据的加密处理。 接下来,我们将逐步解析如何运用BouncyCastle.Crypto库在C#环境下实现这些密码学方案: **1. 引入库与配置开发环境** 在C#应用程序,需要通过NuGet包管理工具或手动方式添加BouncyCastle库的引用。务必确保安装的是1.8.10版本。 ```csharp using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Security; ``` **2. 实施SM2的加签与解签** SM2的签名过程和验证操作涉及椭圆曲线运算。必须创建一个私...

16,550

社区成员

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

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

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