WIN32汇编语言教程:第15章 注册表和INI文件 · 15.3 对注册表的操作(5)

函数的hKey参数指定父键句柄,lpSubKey指向一个字符串,用来表示要打开的子键名称,在系统中一个子键的全称是以“根键\第1层子键\第2层子键\第n层子键”类型的字符串表示的,中间用“\”隔开,字符串的最后以0字符结束,这和目录名的表示方法是很像的。

既然子键的全称是这样表示的,那么要打开一个子键的时候,下面的两种表示方法有什么不同呢?

(1)父键=HKEY_LOCAL_MACHINE,子键=Software\RegTest\MySubkey

(2)父键=HKEY_LOCAL_MACHINE\Software,子键=RegTest\MySubkey

答案是:这两种表示方法是完全相同的。在使用RegOpenKeyEx函数打开子键的时候,既可以将hKey参数设置为HKEY_LOCAL_MACHINE根键的句柄,并将lpSubKey参数指向“Software\RegTest\MySubkey”字符串;也可以将hKey参数设置为“HKEY_LOCAL_ MACHINE\Software”的句柄,将lpSubKey参数指向“RegTest\MySubkey”字符串,得到的结果是一样的。但是,使用第一种方法时,hKey参数可以直接使用助记符HKEY_LOCAL_ MACHINE来表示,因为根键的句柄是固定的,不需要打开;而使用第二种方法时,还需要先打开“HKEY_LOCAL_MACHINE\Software”键来获取它的句柄,所以具体使用哪种方法还要根据具体情况灵活选用。

函数的其他几个参数的含义如下。

● dwOptions参数——系统保留参数,必须指定为0。

● samDesired参数——子键的打开方式,根据使用子键的方式,可以设置为下列取值的组合,只有指定了打开的方式,才能在打开子键后进行相应的操作:

■  KEY_ALL_ACCESS——允许所有的存取。

■  KEY_CREATE_LINK——允许建立符号列表。

■  KEY_CREATE_SUB_KEY——允许建立下一层子键。

■  KEY_ENUMERATE_SUB_KEYS——允许枚举下一层子键。

■  KEY_EXECUTE——允许读操作。

■  KEY_QUERY_VALUE——允许查询键值数据。

■  KEY_READ—KEY_QUERY_VALUE,KEY_ENUMERATE_SUB_KEYS和KEY_ NOTIFY的组合。

■  KEY_SET_VALUE——允许修改或创建键值数据。

■  KEY_WRITE——KEY_SET_VALUE和KEY_CREATE_SUB_KEY的组合。

● phkResult参数——指向一个双字变量,函数在这里返回打开的子键句柄。

如果函数执行成功,返回值是ERROR_SUCCESS,并且函数在phkResult参数指向的变量中返回子键句柄。

当不再需要继续使用键句柄的时候,可以使用RegCloseKey函数将它关闭:

   invoke RegCloseKey,hKey

如果句柄被成功关闭,函数返回ERROR_SUCCESS。


2. 创建和删除子键

创建一个子键可以使用RegCreateKeyEx函数:

   invoke RegCreateKeyEx,hKey,lpSubKey,Reserved,lpClass,dwOptions,\

           samDesired,lpSecurityAttributes,phkResult,lpdwDisposition

函数中与RegOpenKeyEx函数中同名参数的含义和用法是相同的,hKey也是用来指定父键句柄,lpSubKey指向要创建的子键名称字符串,samDesired参数指明子键建立后的操作方式,phkResult指向用来返回键句柄的双字变量。

其余一些参数的含义如下。

● Reserved参数——保留参数,必须设置为0。

● lpClass参数——为创建的子键定义一个类名,这个参数一般设置为NULL。

● dwOptions参数——创建子键时的选项,它可以是以下取值之一:

■  REG_OPTION_NON_VOLATILE——默认值,子键被创建到注册表文件中。

■  REG_OPTION_VOLATILE——创建易失性的子键,子键被保存在内存中,当系统重新启动的时候,子键消失。这个选项仅对Windows NT系统有效,在9x系统中被忽略。

● lpSecurityAttributes参数——指向一个SECURITY_ATTRIBUTES结构,用来指定键句柄的继承性,如果句柄不需要被继承,可以使用NULL。

● lpdwDisposition参数——这个参数一般使用NULL。

当需要创建的子键已经存在的时候,函数仅起到RegOpenKeyEx函数的作用;如果子键不存在,那么函数将创建子键。如果函数执行成功,返回值是ERROR_SUCCESS。

如果要创建“HKEY_LOCAL_MACHINE\Key1\Key2\Key3”子键,既可以将hKey参数设置为HKEY_LOCAL_MACHINE,将lpSubKey参数指向“Key1\Key2\Key3”字符串;也可以先打开“HKEY_LOCAL_MACHINE\Key1”键,将hKey设置为打开的键句柄,然后将lpSubKey参数指向“Key2\Key3”字符串,这和RegOpenKeyEx函数中的用法是类似的。在第二种用法中,打开父键的时候注意要指定KEY_CREATE_SUB_KEY方式。

当被创建子键的上层键不存在的时候,函数连上层的子键一起创建。如上面的例子中,假如Key2也不存在,那么函数先在“HKEY_LOCAL_MACHINE\Key1”下创建Key2,然后在Key2下继续创建Key3。

_Reg.asm文件中的大部分子程序首先用RegOpenKeyEx函数打开子键以便进行下一步操作,但是保存键值用的_RegSetValue子程序中使用的是RegCreateKeyEx函数,这样当子键已经存在的时候,函数仅打开它,如果子键不存在的话则创建子键。

删除子键使用RegDeleteKey函数:

   invoke RegDeleteKey,hKey,lpSubKey

hKey参数为父键句柄,lpSubKey参数指向要删除的子键名称字符串。函数仅删除最后一层子键以及下面的全部键值项。比如在“HKEY_LOCAL_MACHINE\Key1\Key2\Key3”子键存在的情况下,当hKey指定为HKEY_LOCAL_MACHINE,lpSubKey指向“Key1\Key2\Key3”的时候,函数仅删除Key3子键,不会连同Key2,Key1全部删除。但如果Key3子键下有键值项的话,这些键值项会被一起删除。

如果要删除的子键下还存在下一层子键,比如上例中的Key3子键下还存在Key4子键,那么对Key3子键进行删除时,Windows 9x和Windows NT系统的做法是不同的:在Windows 9x中,Key3子键本身、Key3子键下所有的键值项和下层子键(包括上面举例的Key4)会被全部删除;而在Windows NT中,只有在不存在下层子键的情况下删除才能成功,如果Key3子键下还存在Key4子键,那么对Key3子键的删除是不会成功的。

应用程序不能直接在HKEY_LOCAL_MACHINE根键下面创建和删除子键,只能在下一层由系统定义的子键下进行操作,如果要保存配置信息的话,用户应用程序一般在HKEY_LOCAL_MACHINE\SOFTWARE子键下再创建自己的子键,然后将键值项保存在自己的子键中。

15.3.3 管理键值

配置信息是存放在键值项中的,打开或者创建一个键的最终目的都是为了在键下面存取键值项,这就像磁盘上的目录是用来合理组织和管理文件用的,数据还是存放在文件中的。当使用打开或者创建键的函数得到键句柄后,就可以通过它来存取键值项了。

1. 设置键值项

在一个键下面设置和创建键值项使用RegSetValueEx函数:

   invoke RegSetValueEx,hKey,lpValueName,Reserved,dwType,lpData,cbData

hKey参数指定一个键句柄,键值项将保存在这个键下,lpValueName参数指向定义键值项名称的字符串。假如lpValueName参数指向一个空串或者设置为NULL,并且设置的键值类型是REG_SZ的话,那么函数设置的是键的默认值(图15.2中所示的“默认”项)。

Reserved参数是保留的,必须设置为0。

dwType参数指出了要设置的键值数据的类型,可以使用的类型如表15.1所示。

lpData参数是一个指针,指向包含键值数据的缓冲区,cbData参数为要保存的数据长度。缓冲区中的数据格式以及cbData参数指定的数据长度需要和dwType参数指出的键值类型相对应,比如要设置REG_SZ类型的键值项,就要将cbData参数设置为字符串的长度+1(加上尾部的0);同样对于REG_MULTI_SZ类型的键值项来说,最后的两个0的长度都必须包括到cbData参数中;对于REG_DWORD类型的键值项,需要将双字数据放在缓冲区中并将cbData参数设置为4(不像其他函数一样当参数是双字的时候一般将双字在参数中直接传递)。

当子键中的键值项不存在的时候,函数新建键值项;当键值项已经存在的时候,函数将新的键值数据写入。如果键值数据保存成功,函数返回ERROR_SUCCESS。

虽然键值数据的最大长度没有规定,其大小仅受限于可用的内存大小,应用程序甚至可以使用REG_BINARY格式的键值项将整个文件都保存到注册表中,但在实际的使用中还是建议不要将大于2 KB的数据放到注册表中,因为这将影响注册表的使用效率。

要在一个键中创建或修改键值项,键的打开方式中必须包括KEY_SET_VALUE方式。

上页:第15章 注册表和INI文件 · 15.3 对注册表的操作(4) 下页:第15章 注册表和INI文件 · 15.3 对注册表的操作(6)

第15章 注册表和INI文件

版权所有 © 云南伯恩科技 证书:粤ICP备09170368号