c++ 操作注冊表

1.       注冊表简单介绍

注冊表是为Windows NT和Windows95中全部32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息。16位驱动在Winnt (Windows New Technology)下无法工作,所以全部设备都通过注冊表来控制,一般这些是通过BIOS(基本输入输出系统)来控制的。在Win95下,16位驱动会继续以实模式方式设备工作,它们使用system.ini来控制。16位应用程序会工作在NT或者Win95 下,它们的程序仍然会參考win.ini和system.ini文件获得信息和控制。

2.       注冊表结构

2.1.     简单介绍

注冊表是是Microsoft Windows中的一个重要而又复杂的信息数据库,它是多层次式的。在不同系统上注冊表的基本结构同样。当中的复杂数据会在不同方式上结合,从而产生出一个绝对唯一的注冊表。从用户的角度看,注冊表系统由两个部分组成:注冊表数据库和注冊表编辑器。注冊表数据库包含两个文件:system.dat和user.dat。system.dat用来保存微机的系统信息,如安装的硬件和调和驱动程序的有关信息等。user.dat用来保存每一个用户特有的信息,如桌面设置、墙纸或窗体的颜色设置等。因为注冊表是最重要的系统文件之中的一个,因此对于它的保护和备份就特别重要。系统在每次成功启动之后都将此次启动时的注冊表作一个备份。system.dat的备份文件为system.dao,user.dat的备份文件为user.dao。假设因为某种原因注冊表受到破坏,则能够用这两个备份文件来恢复注冊表。Win 98/Win Me备份的注冊表文件保存在C:/WINDOWS/SYSBCKUP目录(这是个隐藏目录)中,文件名是rb000.cab、rb002.cab、rb003.cab、rb004.cab、rb005.cab(通常为五个)。

2.2.     数据结构

注冊表由键(或称“项”)、子键(子项)和值项构成。一个键就是分支中的一个目录,而子键就是这个目录中的子目录,子键相同是一个键。一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。一个键能够有一个或多个值,每一个值的名称各不相同,假设一个值的名称为空,则该值为该键的默认值。

注冊表的数据类型主要有下面四种:


显示类型(在编辑器中)


数据类型


说明


REG_SZ


字符串


文本字符串


REG_MULTI_SZ


多字符串


含有多个文本值的字符串


REG_BINARY


二进制数


二进制值,以十六进制显示


REG_DWORD


双字


一个32位的二进制值,显示为8位的十六进制值

2.3.     几个主键简单介绍

(1)HKEY_CLASSES_ROOT

在注冊表中HKEY_CLASSES_ROOT是系统中控制全部数据文件的项。HKEY_CLASSES_ROOT控制键包含了全部文件扩展和全部和执行文件相关的文件。它相同也决定了当一个文件被双击时起反应的相关应用程序。 HKEY_CLASSES_ROOT被用作程序猿在安装软件时方便的发送信息,在Win95和Winnt中,HKEY_CLASSES_ROOT和HKEY_LOCAL_MACHINE/Software/Classes是相同的。程序猿在执行他们的启动程序时不须要担忧实际的位置,相反的,他们仅仅须要在HKEY_CLASSES_ROOT中增加数据就能够了。

(2)HKEY_CURRENT_CONFIG

win95一般仅仅使用一个硬件配置文件。假设有多个硬件配置文件。HKEY_LOCAL_MACHINE/Config中就会加入一个键。HKEY_LOCAL_MACHINE/Config包括了HKEY_LOCAL_MACHINE中同样的数据。

在启动时,你能够选择你愿意使用的配置文件。假设有多个安装,每次系统又一次启动时,你就必须选择。HKEY_CURRENT_CONFIG是在启动时控制眼下硬件配置的键。在系统启动以后,不论什么地方的变化都会自己主动影响到它。程序猿常常使用HKEY_CURRENT_CONFIG方便的来存取配置信息。HKEY_CURRENT_CONFIG包含了系统中现有的全部配置文件的细节。你的选择影响了哪一个硬件配置文件成为如今的。举例来说,假设配置0002被选择了,全部0002的配置信息会被映射到这些键上。HKEY_CURRENT_CONFIG同意软件和设备驱动程序猿非常方便的更新注冊表,而不涉及到多个配置文件信息。 HKEY_LOCAL_MACHINE中相同的数据和不论什么注冊表的变化都会同一时候的变化。

(3)HKEY_USERS

HKEY_USERS将缺省用户和眼下登陆用户的信息输入到注冊表编辑器,在win95中,它仅被那些配置文件激活的登陆用户使用,相同在winnt下,它也是这样。 win95从user.dat中取得他们的信息,winnt从ntuser.dat中取得信息。.dat文件包括了全部基于用户的注冊表设置并且同意你取配置这些用户的环境。假设你改变了缺省用户的设置,全部新用户会继承相同的设置。并且,那些已经被建立的用户变的失效。

(4)HKEY_LOCAL_MACHINE

HKEY_LOCAL_MACHINE是一个显示控制系统和软件的处理键。HKLM键保存着计算机的系统信息。它包含网络和硬件上全部的软件设置。(比方文件的位置,注冊和未注冊的状态,版本等等)这些设置和用户无关,由于这些设置是针对使用这个系统的全部用户的。

(5)HKEY_CURRENT_USER

HKEY_CURRENT_USER包括着在HKEY_USERS安全辨别里列出的相同信息。不论什么在HKEY_CURRENT_USER里的修改也都会马上HKEY_USERS修改。相反也是这样。   HKEY_CURRENT_USER同意程序猿和开发人员易于存取眼下登陆用户的设置。通过建立这个键,微软非常easy在不涉及到用户的SID下改变,加入和设置。也就是说,全部当前的操作改变仅仅是针对当前用户而改变,并不影响其它用户。

3.       C++操作注冊表

   

3.1.     CRegKey 类及主要使用和函数说明

所须要头文件:atlbase.h  

经常使用函数

(1) 打开一个键的函数:

1RegOpenKeyEx

函数定义:LONG RegOpenKeyEx(HKEY hKey,//已经打开的键的句柄,或者直接是上述几个根键

LPCTSTR lpSubKey,//要打开的子键名字的地址

DWORD ulOptions,//保留值,必须为0

REGSAM samDesired,//打开方式,如读还是写

PHKEY phkResult//返回的打开的子键的句柄

);

2RegOpenKey 这个函数与Windows 3.1兼容。基于Win32的应用程序应该使用RegOpenKeyEx函数。

LONG RegOpenKey(HKEY hKey,        // 要打开键的句柄
                     LPCTSTR lpSubKey, // 要打开子键的名字的地址
                     PHKEY phkResult   // 要打开键的句柄的地址
                     );

注意:RegOpenKey这个函数与Windows 3.1兼容。基于Win32的应用程序应该使用RegOpenKeyEx函数。

(2)查询某一个键值:RegQueryValueEx

函数定义:LONG RegQueryValueEx(HKEY hKey,//要查询的键的句柄

LPCTSTR lpValueName,//要查询的键值的名称

LPDWORD lpReserved,//保留值

LPDWORD lpType,//要查询的数据的类型

LPBYTE lpData,//要返回的查询的数据

LPDWORD lpcbData//预置的数据的长度

);

(3)设置一个键值RegSetValueEx

函数定义:LONG RegSetValueEx(HKEY hKey,//要设置的键的句柄

LPCTSTR lpValueName,//要訪问的键值的名称

LPDWORD lpReserved,//保留值

DWORD dwType,//要设置的数据的类型

const BYTE *lpData,//要设置的健值

DWORD cbData//数据的长度

);

(4)新建指定键RegCreateKey

函数定义:LONG RegCreateKey (HKEY  hkey, // 要打开键的句柄

LPCTSTR lpsubkey, // 要打开子键的名字的地址

PHKEY phkresult // 已打开句柄的缓存区的地址

);

注意:假设这个键在注冊表中已经存在,这个函数打开它。

(5)删除

1删除注冊表指定键下的值

LONG RegDeleteValue(HKEY hKey,            //子键的句柄

LPCTSTR lpValueName  //删除键值的名称

);

2删除注冊表项 (注冊表目录)就用

LONG RegDeleteKey(HKEY hKey,        //已打开的键的句柄

LPCTSTR lpSubKey //要删除的子键或路径

);

RegDeleteKey 也可用来删除一个键值。在 Win 95/98 平台下,也可用来删除整个子键和键值。可是在Windows NT/2000平台下,仅仅能用来删除没有子键的键。

3删除一个带有非常多子键值的键

DWORD SHDeleteKey(HKEY    hkey,// 注冊表打开的键值的句柄

LPCTSTR  pszSubKey //被删除的键值名称

);

当然你得包括头文件shlwapi.h,而且加入shlwapi.lib。

注意:这个函数非常危急,如在你的程序中使用SHDeleteKey(hkey,NULL),将删除HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run下的全部值;假设使用SHDeleteKey(HKEY_CURRENT_USER,”SOFTWARE//Microsoft//Windows//CurrentVersion//Run”),将删除HKEY_CURRENT_USER//SOFTWARE//Microsoft//Windows//CurrentVersion//Run这个键以及以下的全部子键和值。

3.2.     实例

(1)读取注冊表

1查看HKEY_CURRENT_USER主键下Software//武汉帷幄信息技术有限公司//施工工艺决策系统//系统配置//BCGPGanttControls//GanttChartBCGPGantt-0子键中名称为GridProgressColumnIndex的值,其类型为DWORD。

void  OnBnClickedQuery() //响应buttonIDC_QUERY

{

HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭

//打开与路径data_Set相关的hKEY

LPCTSTR data_Set= _T("/Software//武汉帷幄信息技术有限公司//施工工艺决策系统//系统配置//BCGPGanttControls//GanttChartBCGPGantt-0");

//訪问注冊表,hKEY则保存此函数所打开的键的句柄

if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,0,KEY_READ,&hKEY))

{

DWORD dwValue;

DWORD dwSize = sizeof(DWORD);

DWORD dwType = REG_DWORD;

if (::RegQueryValueEx(hKEY,_T("GridProgressColumnIndex"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)

{

AfxMessageBox(_T("错误:无法查询有关的注冊表信息"));

}

//程序结束,关闭打开的hKEY

::RegCloseKey(hKEY);

}

UpdateData(false);

// TODO: 在此加入控件通知处理程序代码

}

能够看到读取的注冊表GridProgressColumnIndex的值是正确的。

2查看HKEY_LOCAL_MACHINE主键下SOFTWARE//Microsoft//Windows NT//CurrentVersion子键中名称为"SoftwareType的值,其类型为REG_SZ。

void OnBnClickedQuery()

{

HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭

//打开与路径data_Set相关的hKEY

LPCTSTR data_Set= _T("SOFTWARE//Microsoft//Windows NT//CurrentVersion");

//訪问注冊表,hKEY则保存此函数所打开的键的句柄

if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY))

{

char dwValue[256];

DWORD dwSzType = REG_SZ;

DWORD dwSize = sizeof(dwValue);

if (::RegQueryValueEx(hKEY,_T("SoftwareType"), 0, &dwSzType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)

{

AfxMessageBox(_T("错误:无法查询有关的注冊表信息"));

}

//程序结束,关闭打开的hKEY

::RegCloseKey(hKEY);

}

UpdateData(false);

// TODO: 在此加入控件通知处理程序代码

}

(2)写注冊表

1在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为DWORD,值为6。

void OnBnClickedChange()//响应buttonIDC_CHANGE

{

HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

HKEY hTempKey;

DWORD dwValue = 6;

DWORD dwSize = sizeof(DWORD);

DWORD dwType = REG_DWORD;

//打开与路径data_Set相关的hKEY

LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");

if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

{

// 使用hKey来操作data_Set这个KEY里面的值。

if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))

{//背景色

if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_DWORD, (CONST BYTE*)&dwValue, sizeof(DWORD)))

{

AfxMessageBox(_T("错误"));

::RegCloseKey(hKey);

return;

}

}

}

::RegCloseKey(hKey);

// TODO: 在此加入控件通知处理程序代码

}

2在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为REG_SZ,值为China。

void OnBnClickedChange()

{

HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

HKEY hTempKey;

CString m_name = "China";

LPBYTE m_name_Set = CString_To_LPBYTE(m_name);//定义x轴名称

DWORD length = m_name.GetLength() + 1;//定义数据长度

//打开与路径data_Set相关的hKEY

LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");

if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

{

// 使用hKey来操作data_Set这个KEY里面的值。

if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))

{

if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_SZ, m_name_Set, length))

{

AfxMessageBox(_T("错误"));

::RegCloseKey(hKey);

return;

}

}

}

::RegCloseKey(hKey);

UpdateData(false);

// TODO: 在此加入控件通知处理程序代码

}

3在HKEY_CURRENT_USER主键下写一个Software//武汉帷幄信息技术有限公司//test111子键,设置其名称为Name,类型为REG_ BINARY,值为ff ac 05 4e。

void OnBnClickedChange()

{

HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

HKEY hTempKey;

BYTE   m_name[10];

memset(m_name, 0, sizeof(m_name));//将数组m_name清零

m_name[0] = 0xff;

m_name[1] = 0xac;

m_name[2] = 0x05;

m_name[4] = 0x4e;

//打开与路径data_Set相关的hKEY

LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");

if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

{

// 使用hKey来操作data_Set这个KEY里面的值。

if (ERROR_SUCCESS == ::RegCreateKey(hKey, _T("test111"), &hTempKey))

{

if (ERROR_SUCCESS != ::RegSetValueEx(hTempKey, _T("Name"), 0, REG_BINARY,(unsigned char *)m_name,5))

{

AfxMessageBox(_T("错误"));

::RegCloseKey(hKey);

return;

}

}

}

::RegCloseKey(hKey);

UpdateData(false);

// TODO: 在此加入控件通知处理程序代码

}

(3)删除注冊表

1删除HKEY_CURRENT_USER//Software//武汉帷幄信息技术有限公司//test111的键值Name

void OnBnClickedDelete()

{

HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

//打开与路径data_Set相关的hKEY

LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司//test111");

if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

{

// 使用hKey来操作data_Set这个KEY里面的值。

if (ERROR_SUCCESS != ::RegDeleteValue(hKey, _T("Name")))

{

AfxMessageBox(_T("错误"));

::RegCloseKey(hKey);

return;

}

}

::RegCloseKey(hKey);

UpdateData(FALSE);

// TODO: 在此加入控件通知处理程序代码

}

2删除HKEY_CURRENT_USER//Software//武汉帷幄信息技术有限公司下的子键

test111。

void OnBnClickedDelete()

{

HKEY hKey;//定义有关的hKEY,在查询结束时要关闭

//打开与路径data_Set相关的hKEY

LPCTSTR data_Set= _T("Software//武汉帷幄信息技术有限公司");

if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))

{

// 使用hKey来操作data_Set这个KEY里面的值。

if (ERROR_SUCCESS != ::RegDeleteKey(hKey, "test111"))

{

AfxMessageBox(_T("错误"));

::RegCloseKey(hKey);

return;

}

}

::RegCloseKey(hKey);

UpdateData(FALSE);

// TODO: 在此加入控件通知处理程序代码

}

c++ 操作注冊表

时间: 2024-10-11 05:27:43

c++ 操作注冊表的相关文章

C#注冊表操作汇总

一.注冊表基本知识 1)       结构 键->项->子项->值项(名称.类型.数据) REG_SZ         字符串 REG_BINARY    二进制 REG_DWORD    双字 2)       组成 1.HKEY_CLASSES_ROOT  定义了系统中全部文件类型标识和基本操作标识 该主键包括文件扩展名和应用程序关联的信息 主键下的子键决定怎样在资源管理器和桌面中显示该类文件及其图标 不是一个单独的分支,而仅仅是HKEY_LOCAL_MACHINE\SOFTWARE

C# 系统应用之注冊表使用具体解释

在平时做项目时,我们有时会遇到注冊表的操作,比如前面我们须要获取IE浏览器地址栏的信息.获取"我的电脑"地址栏输入的目录信息.USB近期使用信息等.注冊表项是注冊表的基本组织单位,它包括子表项和值条目.简言之,注冊表项相当于注冊表里的目录.它们存储计算机安装程序的信息,如颜色设置.屏幕大小.历史记录等. 举个曾经使用注冊表最多的样例:当我们玩魔兽或dota时,总须要打开"执行"->输入"regedit"打开注冊表,在HKEY_CURRENT

《解读window核心编程》 之 注冊表

1 注冊表的作用及组织形式 Windows系统使用注冊表来存储系统和应用程序配置数据.非常多系统和应用程序重要的配置的信息都存储在注冊表中. 注冊表是一种以树型结构组织的数据库.树的每个节点称 作键(key),每一个节点能够包括若干子键,键能够存储数据,存储的数据称作键值.一个键不管其是否有子键,都能够有键值.一个键能够有非常多个键值,每一个键值都有一个名字.包括若干数据.所包括的数据类型能够有非常多种,表10.1列出了注冊表数据类型. 系统自带的注冊表编辑器(regedit.exe)能够列举.

YII用户注冊表单的实现熟悉前台各个表单元素操作方式

模还是必须定义两个基本方法.还有部分label标签映射为汉字,假设进行表单验证,还要定义一些验证规则: <? php /* * 用户模型 * */ class user extends CActiveRecord{ //获得数据模型 public static function model($classname = __CLASS__){ return parent::model($classname); } //定义数据表名字 public function tableName(){ retu

怎样利用WordPress创建自己定义注冊表单插件

来源:http://www.ido321.com/1031.html 原文:Creating a Custom WordPress Registration Form Plugin 译文:创建一个定制的WordPress插件注冊表单 译者:dwqs 开门见山,WordPress提供了一个自己定义的注冊表单供新用户使用,或者当加入一个新用户到已经存在的WordPress网站. 可是假设你想实现一个自己定义的注冊表单而没有显示WordPress仪表盘的选项呢? 在这篇文章中.我们将学会怎么使用标签模

注冊表主键的含义

我们都知道,我们在使用电脑时.在"開始"→"执行"中输入"regedit"并单击"确定"button后,能够打开"注冊表编辑器"对话框,此时能够看见在左边的窗体中显示了注冊表的全部主键.对于Windows 2003/2000/XP 来说仅仅有五个主键.新手要想看的懂注冊表就必须了解这五个主键的指向是什么.以下我们就来一起学习下注冊表主键的详细含义. 1.HKEY_CLASSES_ROOT 该主键用于管理文件

怎样在注冊表禁用或打开windows系统右键菜单

以下是禁用右键方法: 在HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer下? 在右边的窗体中新建一个二进制值"NoViewContextMenu",并设值为"01 00 00 00". ? 改动后需又一次启动WINDOWS,启动后,你将不能在桌面,驱动器,目录等地方使用鼠标右键. 原文地址:https://www.cnblogs.com/llguanli/p/8

struts2学习笔记(三)—— 在用户注冊程序中使用验证框架

实现目标: 1.使用验证框架对用户注冊信息进行验证 2.验证username.password.邮箱不能为空 3.验证username.password长度 4.验证邮件地址格式 详细实现 一.Struts2应用的基础配置 这里不做具体阐述,具体为web.xml.相关jar包的配置 二.将页面显示的文本内容放到资源文件里 1.查看用户注冊程序中的全部页面,找到全部能够显示的文本内容,将它们分离出来放到资源文件里. 2.与相关的Action类同名,以.preperties为扩展名,与Action类

YII用户注冊和用户登录(三)之模型中规则制定和分析

3 模型中规则制定和分析 YII模型主要分为两类,一个数据模型,处理和数据库相关的增删改查.继承CActiveRecord.还有一个是表单模型,继承CFormModel.不与数据库进行交互.操作与数据模型保持一致. 先分析数据模型: 数据模型基本包括四个方法.这里有两个须要注意的地方: 1 还记得视图中有确认password选项吗?数据库中没有这一个字段,不进行处理的话.程序会报错 处理方法:声明这样变量,并将这个变量进行label映射 例如以下: public $password2; // /