1.简介:
注册表是为Windows NT和Windows95中所有32位硬件/驱动和32位应用程序设计的数据文件,用于存储系统和应用程序的设置信息。16位驱动在Winnt (Windows New Technology)下无法工作,所以所有设备都通过注册表来控制,一般这些是通过BIOS(基本输入输出系统)来控制的。在Win95下,16位驱动会继续以实模式方式设备工作,它们使用system.ini来控制。16位应用程序会工作在NT或者Win95 下,它们的程序仍然会参考win.ini和system.ini文件获得信息和控制。
注册表是是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.结构组成:
注册表由键(或称“项”)、子键(子项)和值项构成。一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键。一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。
注册表的数据类型主要有以下四种:
显示类型(在编辑器中) | 数据类型 | 说明 |
REG_SZ | 字符串 | 文本字符串 |
REG_MULTI_SZ | 多字符串 | 含有多个文本值的字符串 |
REG_BINARY | 二进制数 | 二进制值,以十六进制显示 |
REG_DWORD | 双字 | 一个32位的二进制值,显示为8位的十六进制值 |
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下改变,添加和设置。也就是说,所有当前的操作改变只是针对当前用户而改变,并不影响其他用户。
4.注册表的简单操作:
所需要头文件:atlbase.h
/**********************************************************
* 功能:打开注册表
* 参数: HKEY hKey : //要打开的根键
* LPCTSTR lpSubKey //要打开的子键名字的地址
* DWORD ulOptions //保留值,必须为0
* REGSAM samDesired //打开方式,如读还是写
* PHKEY phkResult //返回的打开的子键的句柄
* 返回值:0 表示成功
* 其他代表失败
**********************************************************/
LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);
/**********************************************************
* 功能:创建注册表键
* 参数: HKEY hKey, //要打开的根键的句柄
* LPCTSTR lpsubkey, //要创建子键的名字的地址,不能为空
* DWORD Reserved //保留值,必须是0
* LPTSTR lpClass //一个指向包含键类型的字符串一般为NULL
* DWORD dwOptions //新创建的键设置一定的属性一般为0(键为一个非短暂性的键)
* REGSAM samDesired //设置对键访问的权限
* LPSECURITY_ATTRIBUTES lpSecurityAttributes //一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承
* PHKEY phkresult //一个指向新创建或打开的键的句柄的指针;
* LPDWORD lpdwDisposition //指明键是被创建还是被打开的
* 返回值:0 表示成功
* 其他代表失败
*注意:如果这个键在注册表中已经存在,这个函数打开它。
**********************************************************/
LONG RegCreateKey(HKEY hkey, LPCTSTR lpsubkey, DWORD Reserved, LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult, LPDWORD lpdwDisposition);
/**********************************************************
* 功能:设置注册表键值
* 参数: HKEY hKey, //要设置的根键句柄
* LPCTSTR lpValueName //要创建子键的名字的地址,不能为空
* LPDWORD lpReserved //保留值,必须是0
* DWORD dwType //设置的键值的类型
* BYTE *lpData //一个指向包含数据的缓冲区的指针
* DWORD cbData //指定数据的长度
*
* 返回值:0 表示成功
* 其他代表失败
**********************************************************/
LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, DWORD dwType, const BYTE *lpData, DWORD cbData);
/**********************************************************
* 功能:读取注册表键值
* 参数: HKEY hKey, //要查询的根键的句柄
* LPCTSTR lpValueName, //要查询的键值的名称
* LPDWORD lpReserved, //保留值
* LPDWORD lpType, //要查询的数据的类型
* LPBYTE lpData, //要返回的查询的数据
* LPDWORD lpcbData //预置的数据的长度
* 返回值:0 表示成功
* 其他代表失败
**********************************************************/
LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData);
/**********************************************************
* 功能:关闭注册表句柄
* 参数: HKEY hKey, //关闭指定的注册表键,释放句柄
* 返回值:0 表示成功
* 其他代表失败
**********************************************************/
LONG RegCloseKey(HKEY hKey);
/**********************************************************
* 功能:删除一个键及所有的子键
* 参数: HKEY hKey, //根键
* LPCTSTR lpSubKEY //要删除子键的路径,不能为空
* 返回值:0 表示成功
* 其他代表失败
**********************************************************/
LONG RegDeleteKey(HKEY hKey, LPCTSTR lpSubKEY);
实例:
写注册表:
代码:
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include "windows.h"
using namespace std;
int main()
{
HKEY hWriteKey = NULL; //访问注册表,hWriteKey则保存此函数所打开的键的句柄
char szPath[MAX_PATH] = "Software\\Wow6432Node\\YRegTest\\test";
int nRet = RegCreateKeyEx(HKEY_CURRENT_USER, szPath, 0, NULL, 0, KEY_WRITE, NULL, &hWriteKey, NULL);
if (ERROR_SUCCESS == nRet)
{
cout << "打开/创建注册表键成功!" << endl;
DWORD dwType = REG_DWORD; //设置的数据的类型
DWORD dwValue = 10; //长整型数据,如果是字符串数据用char数组
DWORD dwSize = sizeof(DWORD); //预置的数据的长度
nRet = RegSetValueEx(hWriteKey, "dwKey", 0, dwType, (const BYTE*)&dwValue, dwSize);
if (ERROR_SUCCESS == nRet)
{
cout << "设置注册表中的一个键值成功!" << endl;
cout << "设置的键值为:" << dwValue << endl;
}
else
{
cout << "设置注册表中的一个键值失败!" << endl;
}
}
else
{
cout << "打开/创建注册表键失败!" << endl;
}
RegCloseKey(hWriteKey); //关闭指定的注册表键,释放句柄。
system("pause");
return 0;
}
运行结果:
读注册表:
代码:
#define _CRT_SECURE_NO_WARNINGS
#include "iostream"
#include "windows.h"
using namespace std;
int main()
{
HKEY hReadKey = NULL; //访问注册表,hWriteKey则保存此函数所打开的键的句柄
char szPath[MAX_PATH] = "Software\\Wow6432Node\\YRegTest\\test";
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, szPath, 0, KEY_READ, &hReadKey))
{
DWORD dwValue = 0; //长整型数据,如果是字符串数据用char数组
DWORD dwSize = sizeof(DWORD); //预置的数据的长度
DWORD dwType = REG_DWORD; //要查询的数据的类型
if (ERROR_SUCCESS == RegQueryValueEx(hReadKey, "dwKey", 0, &dwType, (LPBYTE)&dwValue, &dwSize))
{
cout << "读取注册表信息成功!" << endl;
cout << "读取到的注册表值:" << dwValue << endl;
}
else
{
cout << "读取注册表信息失败!" << endl;
}
}
else
{
cout << "注册表打开失败!" << endl;
}
RegCloseKey(hReadKey); //关闭指定的注册表键,释放句柄。
system("pause");
return 0;
}
运行结果:
删除注册表一个键及所有的子键:
代码:
int main()
{
char szPath[MAX_PATH] = "Software\\Wow6432Node\\YRegTest\\test";
if (ERROR_SUCCESS == RegDeleteKey(HKEY_CURRENT_USER, szPath))
{
cout << "删除成功!" << endl;
}
else
{
cout << "删除失败!" << endl;
}
system("pause");
return 0;
}
运行结果: