遍历注册表某一子键下的所有键值

// C++11Demo.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include <iostream>

using namespace std;

// QueryKey - Enumerates the subkeys of key and its associated values.

//     hKey - Key whose subkeys and values are to be enumerated.

#include <windows.h>

#include <stdio.h>

#include <tchar.h>

#define MAX_KEY_LENGTH 255

#define MAX_VALUE_NAME 16383

TCHAR pszSubPath[MAX_VALUE_NAME]=_T("SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall");

//注册表。同步信息

struct tagRegOper

{

tagRegOper()

{

//pszAutoAccreditMark=_T("C:\\Program Files (x86)\\Kingsoft\\SecManage\\Path");

//pszSubPath=_T("SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall");

pszKeyName=_T("DisplayName");

dwRegType = REG_SZ;

hkeyRootPath=HKEY_LOCAL_MACHINE;

RegAccess=KEY_READ;

}

//TCHAR* pszAutoAccreditMark;

//TCHAR* pszSubPath;

TCHAR* pszKeyName;

DWORD  dwRegType;

HKEY   hkeyRootPath;

REGSAM RegAccess;

};

//获取同步信息,即从注册表寻找对应的键值

BOOL GetSynchroInfo(TCHAR* pszSubPath)

{

tagRegOper regOper;

HKEY hKey;

TCHAR szLocation[MAX_PATH] = {‘\0‘};

DWORD dwSize = sizeof(DWORD);

DWORD dwIndex=0;

LONG lRet = RegOpenKeyEx(regOper.hkeyRootPath,pszSubPath, 0,regOper.RegAccess, &hKey);

if(ERROR_SUCCESS!=lRet)

{

//assert(0);

return FALSE;

}

lRet = RegQueryValueEx(hKey,regOper.pszKeyName, 0, &(regOper.dwRegType), NULL, &dwSize);

lRet = RegQueryValueEx(hKey, regOper.pszKeyName, NULL,&(regOper.dwRegType), (LPBYTE)&szLocation, &dwSize);

//找不到

if (ERROR_SUCCESS != lRet)

{

//

}

TCHAR *pszpath=szLocation;

if(_tcsclen(szLocation))

{

printf("%s\n",pszpath);

return TRUE;

}

return false;

}

TCHAR szLocation[MAX_PATH] = {‘\0‘};

void QueryKey(HKEY hKey)

{

TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name

DWORD    cbName;                   // size of name string

TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name

DWORD    cchClassName = MAX_PATH;  // size of class string

DWORD    cSubKeys=0;               // number of subkeys

DWORD    cbMaxSubKey;              // longest subkey size

DWORD    cchMaxClass;              // longest class string

DWORD    cValues;              // number of values for key

DWORD    cchMaxValue;          // longest value name

DWORD    cbMaxValueData;       // longest value data

DWORD    cbSecurityDescriptor; // size of security descriptor

FILETIME ftLastWriteTime;      // last write time

DWORD i, retCode;

LONG lRet;

TCHAR achValue[MAX_VALUE_NAME];

DWORD cchValue = MAX_VALUE_NAME;

DWORD dwRegType = REG_SZ;

DWORD dwSize = sizeof(DWORD);

// Get the class name and the value count.

retCode = RegQueryInfoKey(

hKey,                    // key handle

achClass,                // buffer for class name

&cchClassName,           // size of class string

NULL,                    // reserved

&cSubKeys,               // number of subkeys

&cbMaxSubKey,            // longest subkey size

&cchMaxClass,            // longest class string

&cValues,                // number of values for this key

&cchMaxValue,            // longest value name

&cbMaxValueData,         // longest value data

&cbSecurityDescriptor,   // security descriptor

&ftLastWriteTime);       // last write time

// Enumerate the subkeys, until RegEnumKeyEx fails.

if (cSubKeys)

{

printf( "\nNumber of subkeys: %d\n", cSubKeys);

for (i=0; i<cSubKeys; i++)

{

_tcscpy(pszSubPath,_T("SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"));

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);

_tcscat(pszSubPath,achKey);

GetSynchroInfo(pszSubPath);

}

}

}

}

void _tmain(void)

{

HKEY hTestKey;

if( RegOpenKeyEx( HKEY_LOCAL_MACHINE,

TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"),

0,

KEY_READ,

&hTestKey) == ERROR_SUCCESS

)

{

QueryKey(hTestKey);

}

}

原文地址:https://www.cnblogs.com/gd-luojialin/p/10962955.html

时间: 2024-08-01 07:32:29

遍历注册表某一子键下的所有键值的相关文章

遍历注册表回调函数(仿PCHunter CmpBack)

遍历注册表回调函数(仿PCHunter CmpBack) typedef struct _CAPTURE_REGISTRY_MANAGER { PDEVICE_OBJECT deviceObject; BOOLEAN bReady; LARGE_INTEGER  registryCallbackCookie; LIST_ENTRY lQueuedRegistryEvents; KTIMER connectionCheckerTimer; KDPC connectionCheckerFunctio

C#注册表访问程序Win7系统下报错 “不允许所请求的注册表访问权”

今天一个同事安装完系统的客户端程序后,给发来一个报错截图,如下: 这个是在软件登陆时,有一个保存系统用户名的设置保存到注册表里,一直用着都没问题,今天却报错了.一问才知道他用的win7系统,看来win7对注册表的修改做了一定的限制. 经过测试可以通过修改程序的兼容性及设置权限来解决.因为这个程序是ClickOnce程序,所以要找到这个程序也不容易,动用windows的搜索功能吧,程序安装完会在xxx这样类似的一个目录下,找到启动的主程序,点右键"属性",点"兼容性"

串口编程-枚举遍历串口、获取PC所有串口名称、遍历注册表项、RegEnumValue用法

在网上找了几个关于遍历串口的例子,要么代码不完整,要么就有Bug,如读不了串口号大于10以上的. 经过本人的整理,现分享最终代码,vs2008下编译通过. //此方法同样适用于遍历windows开机启动项,只需稍加修改即可. void CEnumPortDlg::enumPort(void) { HKEY hKey; LPCTSTR lpSubKey="HARDWARE\\DEVICEMAP\\SERIALCOMM\\"; if(RegOpenKeyEx(HKEY_LOCAL_MACH

IT忍者神龟之Hibernate联合主键下,主键生成策略

如果数据库中用多个字段而不仅仅是一个字段作为主键,也就是联合主键,这个时候就可以使用hibernate提供的联合主键生成策略. 具体如下: 可以使用一个组件作为一个实体类的标识符.你的组件类必须满足以下要求: 它必须实现 java.io.Serializable 接口 它必须重新实现 equals() 和 hashCode() 方法,始终和组合关键字在数据库中的概念保持一致 注意:在 Hibernate3 中,第二个要求并非是 Hibernate 强制必须的.但最好这样做. 不能使用一个 Ide

Windows平台使用C语言在用户模式下注册表的增删改查

一.Wiodws注册表介绍 Windows操作系统提供了一个称为“注册表”的中心存储设施作为系统的配置和管理中心.应用程序和内核通过访问注册表来读写各种配置.Windows同时提供了一些API供应用程序访问注册表,这些API函数在接到注册表访问请求后会将他们转发给内核的系统服务.然后内核会做出相应的处理. Widows注册表是一个树状结构,每一个节点是一个键或值.键是一个容器,好比文件系统中的文件夹,值存储的是数据,相当于文件系统的文件,键可以包含其它的键(目录)或值(文件).注册表的根目录称为

注册表遍历操作

// EnumReg.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <Windows.h> int main(int argc, char* argv[]) { HKEY hMainKey = HKEY_CURRENT_USER; HKEY hSubKey; //打开HKEY_CURRENT

注册表项

RegistryKey类在.NET的哪个命名空间中Microsoft.Win32 注册表项是注册表中的基本组织单位,好比是Windows资源管理器中的文件夹.每个具体的注册表项都可以有子项,就像文件夹下可以有子文件夹一样.只要用户具有相应的权限,且注册表项不是基项或基项的下一级项,就可以删除该注册表项.每个注册表项也可带有与其相关联的多个值(一个值就好比是一个文件),它们用于存储信息,例如,有关计算机上安装的应用程序的信息.每个值存储特定的信息,可按需要对其进行检索或更新.例如,可以为您的公司创

[转]C#操作注册表

原文链接:http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-regidit.html 下面我们就来用.NET下托管语言C#注册表操作,主要内容包括: * 注册表项的创建,打开与删除 * 键值的创建(设置值.修改),读取和删除 * 判断注册表项是否存在.判断键值是否存在.准备工作:1:要操作注册表,我们必须要引入必要的命名空间: using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~

[No.000005]C#注册表操作,创建,删除,修改,判断节点是否存在

1 //用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和删除.判断注册表项是否存在.判断键值是否存在. 2 //准备工作: 3 //1:要操作注册表,我们必须要引入必要的命名空间:using Microsoft.Win32;在这个命名空间里面包含了许多注册表相关的类,足够我们使用了. 4 //2:命名空间里面提供了一个类:RegistryKey 利用它我们可以定位到注册表最开头的分支:ClassesRoot,CurrentUser,