注册表的操作与文件的操作非常相似,也有打开、关闭、写入、查询等操作,即“增、删、改、查”所有的功能都有,只是使用的API函数都是以Reg开头的。
1. 打开和关闭注册表
操作注册表需要通过可以操作注册表的句柄,类似于文件操作。在读写注册表之前,需要通过API通过操作注册表,函数打开注册表,返回用于操作注册表的句柄API函数打开返回的句柄,然后读写注册表。读写操作完成后,通过API函数关闭打开的注册表句柄。
打开注册表使用的函数是RegOpenKeyEx()。在Win16下面有一个函数叫RegOpenKey()虽然这个函数在Win32它仍然可用,但它是为兼容目的而设定的。RegOpenKeyEx()函数的定义如下:
参数说明如下。
hKey:指定父键句柄。
lpSubKey:指向字符串,表示要打开的子键名称。
ulOptions:必须将系统保留指定为 0 值。
samDesired:为了方便注册表的操作,通常使用 KEY_ALL_ACCESS 即可。
phkResult:指向双子变量接收打开的子键句柄。
如果函数执行成功,则返回 ERROR_SUCCESS,并且在 phkResult 保存回打开子键的句柄。
打开注册表的本质是打开注册表的子键,然后操作。
注册表操作完成后,需关闭打开的注册表句柄,以释放资源。关闭注册表句柄的函数定义如下:
函数只有一个参数RegOpenKeyEx()函数的最后一个参数,即打开的注册表句柄。
2. 创建和删除子键
创建子键API函数为RegCreateKeyEx()其定义如下:
参数说明如下。
hKey:用于指定父键句柄。
lpSubKey:指向字符串来表示要创建的子键名称。
Reserved:必须将系统保留指定为 0 值。
lpClass:子键类名一般设置为 NULL 值。
dwOptions:通常使用 创建子键时的选项REG_OPTION_NON_VOLATILE宏,表示创建的子键是在注册表文件中创建的,而不是内存。
samDesired:为了方便注册表的操作,通常使用 KEY_ALL_ ACCESS 即可。
lpSecurityAttributes:该参数指向 SECURITY_ATTRIBUTES 结构体用于指定键句柄的安全属性。 通常用于这里NULL。
phkResult:指向双子变量接收打开的子键句柄。
lpdwDisposition:一般设置为 NULL 值。
如果函数执行成功,则返回ERROR_SUCCESS,并且在phkResult保存并返回创建子键的句柄。当需要创建的子键已经存在时,函数发挥作用RegOpenKeyEx()功能相同,打开注册表也可以使用RegCreateKeyEx()函数进行代替。不过该函数的参数比RegOpenKeyEx()函数参数多。因此,为了更容易编写代码,打开注册表或使用它RegOpenKeyEx()函数比较省事。
使用删除子键RegDeleteKey()函数的定义如下:
该函数的值可以用来删除键值项,即函数只能删除下一层的子键。函数有两个参数,hKey为父键句柄,lpSubKey指向要删除的子键名字字符串。
3. 查询、写入和删除注册表键值
使用读取键名中的数据或查询键名的属性RegQueryValueEx()函数的定义如下:
参数说明如下。
hKey:用于指定要读取的键值项的子键句柄。
lpValueName:指定要读取的键值项的名称。
lpReserved:必须保留参数NULL 值。
lpType:如果不需要返回键值类型,可以给 NULL 值。
lpData:用于接收返回的键值数据指向缓冲区。
lpcbData:该参数用于指定缓冲区的长度;当函数返回时,该变量保存缓冲区实际接收的长度。
写入键值项的函数是 RegSetValueEx()其定义如下:
参数说明如下。
hKey:用于指定要写入的键值项的子键句柄。
lpValueName:指定键值项名称的字符串。
Reserved:0 值必须保留参数。
dwType:指出要写入的键数据类型。
lpData:指向要写入键值数据的缓冲区。
cbData:缓冲区长度应写入键值数据。
删除键值项的函数为RegDeleteValue()其定义如下:
参数说明如下。
hKey:用于指定删除的句柄。
lpValueName:删除键值项的名称。
4. 子键和键值的枚举
枚举是一个接一个的获取。子键的枚举逐一获取指定键下的子键。键值的枚举是指指定子键下的键值。
枚举子键的函数是RegEnumKeyEx()其定义如下:
参数说明如下。
hKey:指定被枚举的键句柄。
dwIndex:指定需要返回信息的子键索引号。
lpName:用户接收回子键名称的缓冲区。
lpcName:该参数在调用该函数前保存 lpName 指向缓冲区的长度;该参数保存缓冲区实际接收到的数据的长度。
lpReserved:必须保留参数NULL 值。
lpClass:一般为 NULL 值。
lpcClass:一般为 NULL 值。
lpftLastWriteTime:指向一个 FILETIME 结构体用于接收最后一次被写入的时间。
枚举键值的函数是RegEnumValue()其定义如下:
参数说明如下。
hKey:指定被枚举的键句柄。
dwIndex:指定需要返回信息的键值索引号。
lpValueName:用户接收返回键值名称的缓冲区。
lpcValueName:该参数在调用该函数前保存 lpValueName 指向缓冲区的长度;该参数保存缓冲区实际接收到的数据的长度。
lpReserved:必须保留参数NULL 值。
lpType:指向用于返回键值数据类型的双字变量。
lpData:用户接收返回键值数据的缓冲区。
lpcbData:该参数在调用该函数前保存 lpData 指向缓冲区的长度;该参数保存缓冲区实际收到的数据的长度。
与注册表操作相关的函数就介绍到这里。以上是注册表操作的常用函数,这里无法将注册表操作相关的函数一一介绍,其他相关函数在具体使用时请参考 MSDN 学习。