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允许程序员和开发者易于存取目前登陆用户的设置。通过建立这个键,微软很容易在不涉及到用户的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() //响应按钮IDC_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()//响应按钮IDC_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++ 操作注册表的更多相关文章
- [转]C#操作注册表
原文链接:http://www.cnblogs.com/txw1958/archive/2012/08/01/csharp-regidit.html 下面我们就来用.NET下托管语言C#注册表操作,主 ...
- [荐]使用Js操作注册表
使用Js操作注册表 要操作注册表需要通过ActiveX控件调用WScript.shell对象,通过该对象的一些方法来操作. WshShell对象:可以在本地运行程序.操纵注册表内容.创建快捷方式或访问 ...
- .Net操作注册表--un
C#操作注册表 导入命名空间 Using MicroSoft.Win32;//64位系统装的64位版本
- C#操作注册表全攻略
相信每个人对注册表并不陌生,在运行里面输入“regedit”就可以打开注册表编辑器了.这东西对Windows系统来说可是比较重要的,也是病 毒常常会光顾的地方,比如病毒和恶意软件常常会在注册表的启动项 ...
- C#获取cpu序列号 硬盘ID 网卡硬地址以及操作注册表 .
转:http://blog.csdn.net/smartsmile2012/article/details/8682295 #region 获取cpu序列号 硬盘ID 网卡硬地址 /**/ /// & ...
- VBS 操作注册表 十六进制
使用VBS操作注册表,通常使用RegRead/RegWrite/RegDelete方法,如: RegRead: 'read.vbs(将以下代码存为read.vbs文件) Dim OperationRe ...
- win7 64bit+vs2010 操作注册表
注册表五个根键 HKEY_CLASSES_ROOT--管理文件系统 HKEY_LOCAL_MACHINE--管理当前系统硬件配置 HKEY_LOCAL_USER--管理系统当前用户配置 HKEY ...
- How to:Installshield判断操作系统是否为64位,并且为操作注册表进行设置
原文:How to:Installshield判断操作系统是否为64位,并且为操作注册表进行设置 IS脚本操作注册表在64位平台下必须有特殊的设置 if (SYSINFO.bIsWow64) then ...
- C# 访问操作注册表整理
一..net注册表操作简介 .net中Registry 类,RegistryKey 类提供了操作注册表的接口 RegistryValueKind,用于指定操作注册表的数据类型. 二.使用实例 //获取 ...
随机推荐
- study
1.perf, top, vtune, /sys/kernel/debug/mid_pmu_states使用 2.cpu hotplug 3.camera record时有可能耗电的地方: 硬件加速是 ...
- winform下自绘提示框风格窗体
昨天分享了一个环形滚动条控件,今天分享一个提示框风格的窗体.代码如下: /// <summary> /// 继承自Form,但将FormBorderStyle设置为None /// < ...
- Flex布局总结
2009年,W3C提出了一种新的方案----Flex布局,可以简便.完整.响应式地实现各种页面布局.目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能.lex布局将成为未来布局 ...
- 洛谷P3374 【模板】树状数组 1
P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两 ...
- ASP.NET MVC 5 一 入门
本系类教程将要构建ASP.NET MVC 5 Web 应用程序,使用的工具是VS2013 .现在有预览版可以下载了, 点击下载VS2013 FOR WEB ISO文件 .VS2012 还没用几天呢,2 ...
- COOKIE&&SESSION
---------------------------------------------------------------------------COOKIE------------------- ...
- 8. js中json格式解析
var doc = O_PARAMETER.FJSonStr;(doc为:{"items":[],"nextId":0}) //1.先转为json对象,主要有以 ...
- 消息框用法MessageBox
关键字:C# MessageBox 消息对话框 在程序中,我们经常使用消息对话框给用户一定的信息提示,如在操作过程中遇到错误或程序异常,经常会使用这种方式给用于以提示.在C#中,MessageBox消 ...
- Mysql 存储过程基本语法
delimiter //一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行. 一.创建存储过程 1.基本语法: crea ...
- jquery selector checkbox
$("#competencyList input:checkbox").on("click", function () { var checkedCompete ...