⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12.7 注册表的编程.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 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 + -