原博:https://blog.csdn.net/denghubu/article/details/5765921

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: 在此添加控件通知处理程序代码

}

windows下注册表的操作的更多相关文章

  1. windows下注册表脚本编写

    Reg文件就是我今天所说的注册表脚本文件,双击可将其中的数据写入注册表.利用注册表脚本文件可以对注册表进行关于键值的任何操作,而且还不受注册表被禁用的限制.     我们平常对注册表的修改大体上可以分 ...

  2. 【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法

    原文:[VS调试]C#读写Windows 7注册表时抛出"不允许所请求的注册表访问权"的解决办法 项目 - 属性 - 安全性,"使用ClickOnce",修改a ...

  3. [转]Windows系统注册表知识完全揭密

    来源:http://www.jb51.net/article/3328.htm Windows注册表是帮助Windows控制硬件.软件.用户环境和Windows界面的一套数据文件,注册表包含在Wind ...

  4. Windows -- 从注册表删除IE浏览器加载项

    Windows -- 从注册表删除IE浏览器加载项 1.  一部分加载项从注册表以下位置直接删除 2.  一部分扩展项从注册表以下位置直接删除

  5. 解决windows下MySQL表名大写自动变小写的问题

    解决windows下MySQL表名大写自动变小写的问题   有些人可能会遇到在windows下,表名不能用大写字母, 即使使用了大写字母的建表语句,还是会被自动转成小写.   解决方法:  打开 My ...

  6. windows下注册ocx控件

    OCX 是对象类别扩充组件(Object Linking and Embedding (OLE) Control Extension):是可执行的文件的一种,但不可直接被执行: 是 ocx 控件的扩展 ...

  7. Windows下python3登陆和操作linux服务器

    一.环境准备 python3远程连接需要用到pycrytodome和paramiko库,其中后者依赖前者,所以按照顺序来安装 1. 安装pycrytodome 1 pip install pycryt ...

  8. C# 32位程序在64位系统下注册表操作

    在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制.目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与 ...

  9. Windows 注册表常用操作

    1 添加一个主键(比如在HKEY_LOCAL_MACHINE\SOFTWARE\中添加一个ABCEDFGHIJKLMN主键) Windows Registry Editor Version 5.00 ...

随机推荐

  1. 【TCP/IP 协议】 TCP/IP 基础

    总结 : 通过学习 TCP/IP 基础, 并总结相关笔记 和 绘制思维导图 到博客上, 对 TCP/IP 框架有了大致了解, 之后开始详细学习数据链路层的各种细节协议, 并作出笔记; 博客地址 : h ...

  2. HttpClient 解决中文乱码

    public static String httpGet(String url) { try { HttpGet httpGet = new HttpGet(url); HttpClient clie ...

  3. 【IOS 开发】Object - C 语法 之 类型转换

    作者 : 万境绝尘 (octopus_truth@163.com) 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/3913507 ...

  4. web多语言url的设计

    因为项目要支持国际化,最近跟一个同事在讨论多语言版本下面url如何设计,假如我们需要支持en和cn的版本. 他倾向于支持如下的url格式,后续以格式1指代: /en/group/abc.html /c ...

  5. ZooKeeper实现分布式锁

    使用场景          一般的锁是指单进程多线程的锁,在多线程并发编程中,用于线程之间的数据同步,保证共享资源的访问.而分布式锁,指的是在分布式环境下,保证跨进程.跨主机.跨网络的共享资源,实现互 ...

  6. AndroidBinder进程间通信系统-android学习之旅(86)

    目录 前言及知识准备 Service组件结构 Clinet组件结构 与Binder驱动程序交互 总结 Binder进程间通信实例 问题 本次主要介绍Android平台下Binder进程间通信库.所谓通 ...

  7. U盘无法安装win10提示Your PC/Device needs to be repaired

    前一阵子把笔记本自带的win8升级到8.1,又升级到win10. 差不多有一个月没有开机,前几天开机后进不了系统,出现如下图的提示.买电脑自带的win8是正版的,但升级到win10后就过期了,也真是坑 ...

  8. 【翻译】在Ext JS应用程序中使用自定义图标

    原文:Using Custom Icons in Your Ext JS App 作者:Lee BoonstraLee is a technical trainer at Sencha. She's ...

  9. Linux下的tree命令 --Linux下目录树查看

    Linux下的tree命令 --Linux下目录树查看 有时我们需要生成目录树结构,可以使用的有ls -R,但是实际效果并不好 这时需要用到tree命令,但是大部分Linux系统是默认不安装该命令的, ...

  10. Mondrian Schema workbench工作界面 简介(实在懒得写,居然有人弄了,收藏了)

    转自:http://hi.baidu.com/dinguangx/item/37e78be29aebc1adcf2d4f89 Schema Schema 定义了一个多维数据库.包含了一个逻辑模型,而这 ...