转自 http://blog.csdn.net/xiaoxiaohai123/article/details/1685153 (部分修改)
参考《深入解析Windows操作系统》(第四版) 潘爱民 译
一、简介:
注册表(Registry),本质上来说,就是一个数据库,用于存储系统和应用程序的设置信息,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用,其结构类似于磁盘卷的结构。注册表包含了 键(key)和 值(value)。键类似于磁盘的目录,而值则好比磁盘上的文件。键是一个容器,可以包含其他的键(子键)和值,而值存储的是数据。最顶级的键是根键(Root key),只有根键才不是子键。
注册表有6个根键,你不能加入新的根键,也不能删除已有的根键。打开注册表就能看见其结构。打开方法:(1)直接双击regedit.exe,一般位于C:\Windows目录下(操作系统装在C盘);(2)“开始”----“运行“,在出现对话框中输入regedit,然后回车即可。
注册表的每个根键句柄都是固定不变的,如下表所示:
键名 | 句柄 | 键名 | 句柄 |
HKEY_CLASSES_ROOT | &H80000000 | HKEY_DYN_DATA | &H80000006 |
HKEY_CURRENT_CONFIG | &H80000005 | HKEY_LOCAL_MACHINE | &H80000002 |
HKEY_CURRENT_USER | &H80000001 | HKEY_USERS | &H80000003 |
程序中要用到的注册表数据类型如下表所示:
REG_BINARY | 二进制数据 |
REG_DWORD | 32位双字 |
REG_DWORD_LITTLE_ENDIAN | 大计数法格式32位数字,一个字的有效字节是高端字 |
REG_DWORD_BIG_ENDIAN | 大计数法格式32位数字,一个字的有效字节是低端字 |
REG_EXPAND_SZ | 空终止字符串,包括对"&TEMP&"之类环境变量的引用 |
REG_LINK | 单一代码符号链 |
REG_MULTI_SZ | 定义包括空终止字符串的数组,数组被两个实际的空字符串结束 |
REG_NONE | 未定义值类型 |
REG_RESOUSE_LIST | 设备驱动程序列表 |
REG_SZ | 空字符串,是保存字符串的最通用格式 |
二、API操作
既然注册表对于操作系统来说,至关重要。那么对于注册表的修改,就必须十分谨慎。(如果你掌握了安全的修改注册表的方法,还是能做出很多意想不到的效果滴)一般而言,我们不推荐直接编辑注册表,而微软也为我们提供了一下API来操作注册表,本文就借助简单的例子介绍一下常用的几个函数的运用。
(1)RegCreateKeyEx ——创建一个键,如果这个键已经存在的话,就相当是把它打开了。
其声明如下:(九个参数)
LONG RegCreateKeyEx(
HKEY hKey,
LPCTSTR lpSubKey,
DWORD Reserved,
LPTSTR lpClass,
DWORD dwOptions,
REGSAM samDesired,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult,
LPDWORD lpdwDisposition
);
参数介绍:
hKey:这是一个已经打开的键的句柄,看来是要在一个已经打开的键建立一个子键了。就好象在一个已经存在的目录下建立一个字目录一样。如果你开始没有一个已经打开的键的句柄,则hKey可以是如下的值:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS
HKEY_DYN_DATA (只能是Win98,Win95,WinMe系统)
lpSubKey:一个字符串,不用说是什么意思了吧?就是说你要把你的注册表键放在哪个位置了。注意:lpSubKey不能为NULL,且字符串中 \ 应为 \\ ;
Reserved:保留的,必须是0。
lpClass:一个字符串,据说是指定你要建立的键的类型,设它为NULL;
dwOptions:对你建立的键的一些选项。可以是这些值:REG_OPTION_NON_VOLATILE,REG_OPTION_VOLATILE,REG_OPTION_BACKUP_RESTORE
samDesired:对这个新建的键的访问权限了,一般设置为KEY_ALL_ACCESS;
lpSecurityAttributes:可设为NULL。
phkResult:这可是个很重要的参数了,建立一个键后,这个键的句柄就放在这里,以后操作就全靠它了。注意了,它是一个指向HKEY的指针。
lpdwDisposition:又是一个指针,调用完此函数后,可以通过它来检测是打开了一个已经存在的键(REG_OPENED_EXISTING_KEY),还是建立了一个键(REG_CREATED_NEW_KEY)。
当创建一个键成功,其返回值为ERROR_SUCCESS,否则,则为失败。
#include<windows.h>
void main()
{
DWORD dwRes;
HKEY hk;
if(ERROR_SUCCESS==
RegCreateKeyEx(HKEY_LOCAL_MACHINE,
"SOFTWARE//Carrier Studio//Hello",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hk,
&dwRes)
printf("Create key Successful!\n");
}