📄 12.7 注册表的编程.txt
字号:
12.7 注册表的编程
12.7.1 注册表 API
注册表存储在二进制文件中, Win32 API提供了大量的函数以便应用程序访问注册表。在下面的内
容中将介绍一些常用的与注册表操作相关的 API函数。
1.创建键
首先介绍 RegCreateKey函数,该函数将创建指定的注册表项,如果这个表项己经存在,则该函数将
打开这个表项。 RegCreateKey函数的声明形式如下所示。
LONG RegCreateKey(
HKEY hKey ,
LPCTSTR lpSubKey ,
PHKEY phkResult
RegCreateKey函数具有三个参数,其含义分别如下所述:
. hKey
指向当前打开表项的句柄,或者是下列预定义的保留句柄值之一,实际上就是注册表中的几个分支:
. HKEY_CLASSES_ROOT
. HKEY CURRENT_CONFIG
. HKEY CURRENT_USER
. HKEY LOCAL_MACHINE
. HKEY USERS
. Windows NT: HKEY PERFORMANCE DATA
Windows 95和 Windows 98: HKEY DYN DATA
. IpSubKey
指向一个空终止的字符串指针,指示这个函数将打开或创建的表项的名称。这个表项必须是由 hKey
参数所标识的项的子项。
. phkResult
这是一个返回值,指向一个变量的指针,用来接收创建或打开的表项的句柄。当不再
需要此返回的注册表项句柄时,调用RegCloseKey函数关闭这个句柄。
2.打开键
在可以处理注册表之前,需要打开注册表中的一个键,这可以利用RegOpenKey函数来实现,该函数
将打开指定的注册表。 RegOpenKey函数的原型声明如下所述。
LONG RegOpenKey(
HKEY hKey ,
LPCTSTR lpSubKey ,
PHKEY phkResult
RegOpenKey函数具有三个参数,其含义分别如下所述:
. hKey
同 RegCreateKey函数的hKey参数。
. lpSubKey
同 RegCreateKey函数的IpSubKey参数。
. phkResult
指向一个变量的指针,该变量保存此函数所打开的注册表项的旬柄。当不再需要此返回的注册表项
句柄时,调用RegCloseKey函数关闭这个句柄。
3.写入注册表
RegSetValue函数可以设置指定注册表项的默认值或者未命名值的数据。在注册表中,对值来说,包
含三个部分:值名称、值类型和值本身。例如在上面图所示的注册表编辑器窗口中, admin是值的名
称,阻止SZ是值的类型, zhangsan是值本身。另外,在注册表中有些值是没有名称的,例如该值是
默认值。
RegSetValue函数的声明形式如下。
LONG RegSetValue(
HKEY hKey ,
LPCTSTR lpSubKey ,
DWORD dwτ'ype,
LPCTSTR lpData, .
DWORD cbData
RegSetValue函数具有五个参数,其含义分别如下所述:
. hKey
同 RegCreateKey函数的hKey参数。
. lpSubKey
同RegCreateKey函数的lpSubKey参数。该函数为该参数指定的子项设置默认值。如果此参数为 NULL,
或指向一个空字符串,那么此函数将为参数hKey所指定的注册表项
设置默认值。
. dwType
指示将被存储的信息类型。该参数必须是阻G SZ类型,实际上就是字符串类型。如果要存储其他类
型的数据,必须使用另一个函数: RegSetValueExo
. lpData
指向一个空终止的字符串,该字符串中包含了要为指定项的默认值设置的数据。
. cbData
指示 lpData参数所指向的字符串的大小,单位是字节,但不包含字符串最后的空终止字符。
另外,如果想要设置注册表项下不是默认值,即有名称值的数据和类型时,可以调用 RegSetValueEx
函数,该函数将在注册表项下设置指定值的数据和类型。该函数的原型声明如下所示。
LONG RegSetValueEx(
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
RegSetValueEx函数具有六个参数,其含义分别如下所述 :
. hKey
同 RegCreateKey函数的 hKey参数。
. lpValueName
指向一个字符串的指针,该字符串包含了欲设置值的值名称。若拥有该名称的值并不存在于指定的
注册表项中,则此函数将其加入到该项中。如果此参数为 NULL,或指向空字符串,则此函数为该项
的默认值或未命名值设置类型和数据。
. Reserved
保留,必须为 0。
. dwType
指定将被存储的值的数据类型,该参数可以取如表 12.12中所示的类型代码之一。
表 12.12注册表项值的类型代码
取值REG BINARY 说明 任何形式的二进制数据
REG DWORD 一个 32位的数字
REG一DWORD_Lln'LE_ENDIAN 一个"低字节在前"格式的 32位数字.它和 REG_DWORD是等价的。在"低
字 节在前"格式下,一个多字节的值在内存中核先低字节后高字节的顺序存储
REG_DWORD_BIG_ENDIAN 一个"高字节在前"格式的 32位数字。在"高字节在前"格式下,一个多字节
的 值在内存中按先离字节后低字节的顺序存储
REG EXPAND SZ 一个以 0结尾的字符串,该字符串包含对环境变量 (如 "%PAHT')的未扩展引用
第 12
‘ .... 1475
续表
取值REG LJJ可 KREG MULTI SZ REG_NONE REG RESOURCE LIST REG SZ 说明 一个 U nicode格式的
带符号链接 一个以 0结尾的字符串数组,该数组以连接两个 O为终止符 未定义值类型 一个设备驱
动器资源列表 一个以 0结尾的字符串
. lpData
指向一个缓冲区,该缓冲区包含了欲为指定值名称存储的数据。
. cbData
指定由 lpData参数所指向的数据的大小,单位是字节。
4.从注册表中读数据
RegQueryValue函数可以获得指定注册表项默认的值或未命名的值相关的数据,该函数的原型声明如
下所示。
LONG RegQueryValue(
HKEY hKey ,
LPCTSTR lpSubKey ,
LPTSTR lpValue ,
PLONG lpcbValue
RegQueryValue函数具有四个参数,其含义分别如下所述 :
. hKey
同 RegCreateKey函数的 hKey参数。
. lpSubKey
同 RegCreateKey函数的 lpSubKey参数。
. lpValue
是一个返回值,指向一个缓存区,用来获得与指定子项默认值相关的一个字符串。
. lpcbValue
指向一个变量,指定用此参数指定的 buffer的大小。当这个函数返回时,该参数包含了被复制到
buffer字符大小,该大小包含了数据长度还加上了终止的空字符。
如果在调用 RegQueryValue函数时,将其第三个参数设置为 NULL,第四个参数设置为非 NULL.那么
该函数将返回存储数据的大小。这样,可以让应用程序确定一个最佳的方式来存储将要获取到的数
据,也就是说,程序可以根据该函数此时返回的数据长度动态地分配一块内存,用来保存将要获取
到的数据,然后再去获取数据。因此,如果在调用 RegQueryValue函数时还不知道将要获取的数据
的大小,就可以采用这种方法,依次调用两次 RegQuery Value函数,第一次调用该函数得到将要获
取的数据的长度,然后动态分配内存,接着再次调用该函数得到数据。下面的示例就使用这种方法
实现的。
同样,如果想要读取注册表项下不是默认值,即有名称值的数据和类型时,可以调用
476 I ~~~
RegQueryValueEx函数,该函数将读取注册表项下指定值的数据和类型。该函数的原型声明如下所示。
LONG RegQueryValueEx(
HKEY hKey ,
LPTSTR lpValueName ,
LPDWORD lpReserved,
LPDWORD lpTypè,
LPBYTE lpData,
LPDWORD lpcbData
RegQueryValueEx函数具有六个参数,其含义分别如下所述:
. hKey
同 RegCreateKey函数的hKey参数。
. lpValueName
指向一个以O结尾的字符串的指针,该字符串包含想要查询的值的名称。如果此参数
为 NULL或指向一个空字符串,则RegQueryValueEx函数将获得该注册表项的未命名值或默认值的类
型及数据,如果这些值和数据存在的话。
. lpReserved
保留,必须为NULL。
. lpType
指向一个变量的指针,该变量用于接收保存在指定值中的数据的类型代码(参见上面 RegSetValueEx
函数的lpType参数的说明)。如果不需要类型代码,此参数可以为NULL。
. lpData
一个指向缓冲区的指针,该缓冲区接收该值的数据。如果不需要此数据,这个参数可
以为NULL。
. lpcbData
指向一个变量的指针,该变量指示由参数lpData所指的缓冲区的以宇节计的大小。当
RegQueryVa1ueEx函数返回时,此参数所指向的变量则包含了实际复制到缓冲区的字节数。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -