一、什么是Windows注册表

Windows注册表是Windows操作系统的一个重要组成部分,其作为操作系统的配置信息库保存了系统所需的各种设置信息,包括软硬件信息、用户账户信息、程序运行时所需信息等。

每个程序的设置都会在Windows注册表中找到相应的配置信息。

Windows注册表其实就是一个类似于文件夹之间关系的树状结构,每个节点都是一个键(key),每个键下面又可以有多个键值(value),这些键和键值组成了一个中心化的配置信息库。

二、Windows注册表数据类型

Windows注册表中的每个键值都有特定的数据类型。以下是Windows注册表支持的数据类型:

  • REG_BINARY:二进制数据类型
  • REG_DWORD:32位二进制数据类型
  • REG_QWORD:64位二进制数据类型
  • REG_SZ:字符串类型
  • REG_EXPAND_SZ:扩展字符串类型
  • REG_MULTI_SZ:多字符串类型

其中,二进制数据类型、32位二进制数据类型和64位二进制数据类型用于存储二进制数据, REG_SZ 用于存储字符串数据, REG_EXPAND_SZ 用于存储字符串数据,REG_MULTI_SZ 用于存储多个字符串,并将其合并为一个值。

三、Windows注册表的结构和分支键

Windows注册表可以看作是一个类似于文件夹之间关系的树状结构,如下图所示:

    HKEY_CLASSES_ROOT
    HKEY_CURRENT_USER
    HKEY_LOCAL_MACHINE
    HKEY_USERS
    HKEY_CURRENT_CONFIG

Windows注册表的主要分支分为五个,每个分支有自己的功能:

  • HKEY_CLASSES_ROOT(HKEY_CLASSES_ROOT) 存放 Windows 程序中的类声明,COM 对象声明以及拓展名与相应应用程序间的关联等等。这个分支主要描述了不同文件类型的类别信息,并为这些文件类型指定一个程序来进行打开。

  • HKEY_CURRENT_USER(HKEY_CURRENT_USER) 接受有关当前用户(用户登录到系统后)的设置信息,例如,桌面颜色、屏幕保护程序参数和用户的基础桌面。这个分支是指当前用户。

  • HKEY_LOCAL_MACHINE(HKEY_LOCAL_MACHINE) 成为应用程序数据,文本屏幕设置等等的主位。这个分支存储了计算机硬件和软件的配置信息,包括认证机制、安全等级、系统硬件和软件。

  • HKEY_USERS(HKEY_USERS) 存储了与操作系统中所有用户帐户相关的配置信息。

  • HKEY_CURRENT_CONFIG(HKEY_CURRENT_CONFIG) 存储计算机启动时硬件的配置信息。

四、Windows注册表的应用

1. 操作系统优化

Windows注册表是操作系统中的一个重要元素,可以用来做很多的优化。

例如,通过在Windows注册表中增加/修改一些键值,我们可以快速开启/关闭系统中某些服务,开启/关闭某些控制面板中的选项等等,让我们的系统更加优化和稳定。

2. 监控系统配置信息

Windows注册表中记录了很多系统和应用软件的配置信息,通过注册表的监控,可以知道哪些程序启动了,哪些程序修改了键值,根据这些信息我们可以及时调整系统和程序的设置。

3. 系统维护和故障诊断

如果我们的系统遇到了故障,可以使用 Windows 注册表清理来帮助修复问题。例如,如果我们在安装新软件时遇到蓝屏,可以在Windows注册表删除错误的键值。

五、示例代码

//打开或者创建HKEY_LOCAL_MACHINE分支下的键test
HKEY hKey;
DWORD dwDisposition = 0;
if(ERROR_SUCCESS==RegCreateKeyEx(HKEY_LOCAL_MACHINE,"test", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition)) 
{
    //写入键值为DWORD类型的数据
    DWORD dwValue = 1000;
    if(ERROR_SUCCESS == RegSetValueEx(hKey, "dwValue", 0, REG_DWORD,(LPBYTE)&dwValue, sizeof(DWORD)))
    {
        //写入键值为字符串类型的数据
        const char* strValue = "HelloWorld";
        if(ERROR_SUCCESS == RegSetValueEx(hKey, "strValue", 0, REG_SZ,(LPBYTE)strValue, strlen(strValue)+1))
        {
            printf("写入成功!");
        }
    }
    RegCloseKey(hKey);
}