要创建一个新的子键,用户通过选择根键和输入子键,然后用户输入值项名和值串后,单击“创建子键”按钮,就可以创建一个新的子键。为把该功能添加到程序中,需要给IDC_CREATE_SUBKEY的BN_CLICKED事件消息添加一个函数,把此函数命名为OnCreateSubKey。编辑此函数,添加的代码如程序清单1-1所示。
程序清单1-1 CKeyEditor::OnCreateSubKey函数
从程序清单1-1可以看出,创建一个新键要做很多工作。你也许认为只要输入父键路径名、新子键名和任何值就行了,其实不然。把注册表作为一种数据库来考虑,为安全起见,在对注册表进行操作之前,首先要打开所要操作的子键对应的父键,得到父键的句柄,并将其保留。有了父键句柄,就可以创建新的子键。如果不保留父键句柄,另一个应用程序如果为在同一个父键下创建一个新的子键,信息就可能对不上号或者使前面的操作无效。许多安装程序或应用程序可能直接从根键创建许多子键,此根键必须加以保留,防止其它的应用程序修改根键的子结构。
为了更好地理解程序清单1-1中有关对注册表进行的操作,下面就程序清单1-1中使用的注册表操作函数进行详细的说明。
1. RegOpenKeyEx函数
RegOpenKeyEx函数的作用是打开注册表中一个指定的键。当要对注册表进行访问时,必须要将所要访问的键打开后,才可以进行访问。RegOpenKeyEx的函数原型如下:
函数的参数:
(1)hKey:HKEY类型,对应一个已经打开键的句柄,或者是预定义的根键句柄。常用的根键句柄包括:
HKEY_CLASSES_ROOT,
HKEY_LOCAL_MACHINE,
HKEY_CURRENT_USER,
HKEY_USERS,
HKEY_ CURRENT_CONFIG。
根键句柄是Windows系统与定义的,可以直接使用。
(2)lpSubKey:字符串类型的指针,用来指定要打开的子键的名字,如果此参数为NULL或者是空串,函数就使用hKey的指定打开一个新句柄,原来的句柄不关闭。例如要打开:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\子键,则函数的各参数应这样设置:
(3)ulOptions:保留值,必须为0。
(4)samDesired:设置新打开键的访问方式,此参数可以是下面几个值的组合:
KEY_ALL_ACCESS,
KEY_CREATE_LINK,
KEY_CREATE_SUB_KEY,
KEY_ENUMERATE_SUB_KEYS,
KEY_EXECUTE,KEY_NOTIFY,
KEY_QUERY_VALUE,
KEY_READ,
KEY_SET_VALUE,
KEY_WRITE。
(5)phkResult:打开子键的返回句柄,当不再使用此句柄时,要用RegCloseKey函数关闭。
函数的返回值:
如果函数执行成功,它的返回值是ERROR_SUCCESS;如果不成功,返回一个非0的错误码。关于错误码的具体含义可参见MSDN帮助及相关的书籍,在此不详细说明。
2. RegCreateKeyEx函数
RegCreateKeyEx函数的作用是在注册表中创建一个子键,如果子键创建成功就打开此子键。RegCreateKeyEx的函数原型如下:
函数的参数:
(1)hKey:已经打开的父键句柄,或者是预定义的根键句柄,详细的说明请见RegOpenKeyEx函数的参数说明。函数将在hKey句柄对应的键下建立子键。
(2)lpSubKey:字符串类型的指针,用来指定要建立的子键的名字。
(3)Reserved:保留值,必须为0。(www.xing528.com)
(4)lpClass:指向键的类别的字符串指针。如果键已经存在,则该参数被忽略。
(5)dwOptions:指定所创建的子键以何种方式存在的特殊选项。该参数的取值可以下列之一:
REG_OPTION_NON_VOLATILE(默认):表示新创建的子键不是易失的。信息保存在文件中,系统重启后可以使用。
REG_OPTION_VOLATILE:表示新创建的子键易失的。信息只存放在内存中。
REG_OPTION_BACKUP_RESTORE:表示创建子键后忽略访问掩码,试图为备份和恢复函数打开此键。
(6)samDesired:为所创建的子键指定访问权限,详细的说明参见RegOpenKeyEx函数。
(7)lpSecurityAttributes:SECURITY_ATTRIBUTES结构的指针,该参数决定返回的键句柄能否为子进程继承。
(8)phkResult:当子键创建成功,该参数存储所创建子键的返回句柄,当不再使用此句柄时,要用RegCloseKey函数关闭。
(9)lpdwDisposition:指向具有下列值之一的变量指针。
REG_CREATED_NEW_KEY:如果键不存在,则创建该键。
REG_OPENED_EXISTING_KEY:如果键已存在,则直接打开该键。函数的返回值:
如果函数执行成功,它的返回值是ERROR_SUCCESS;如果不成功,返回一个非0的错误码。关于错误码的具体含义参见MSDN帮助及相关的书籍,在此不详细说明。
函数说明:
应用程序可以使用RegCreatekeyEx函数一次创建几个键,比如程序要一次建立一个四层深的子键,lpSubKey参数可以指定为下面的形式:
subkey1\\subkey2\\subkey3\\subkey4
在注册表中没有的subkey1~subkey3键也同时建立。
3. RegSetValueEx函数
RegSetValueEx函数的作用是指定的子键下设置值项。RegSetValueEx的函数原型如下:
函数的参数:
(1)hKey:已经打开键的句柄,或者是预定义的根键:
HKEY_CLASSES_ROOT,
HKEY_LOCAL_MACHINE,
HKEY_CURRENT_USER,
HKEY_USERS,
HKEY_ CURRENT_CONFIG等。
(2)lpValueName:要设置的键值项的名字,是一个字符串类型指针。如果lpValueName为NULL或是空串,函数就取得当前指定键默认键值项的值及其类型。
(3)lpReserved:保留值,必须为0。
(4)lpType:要设置键值项数值的类型,此参数可以取下列值之一:REG_BINARY,REG_DWORD,REG_DWORD_LITTLE_ENDIAN,REG_DWORD_BIG_ENDIAN,REG_EXPAND_SZ,REG_LINK,REG_MULTI_SZ,REG_NONE,REG_RESOURCE_LIST,REG_SZ,具体说明参见表1-3。
(5)lpData:设置的数值所在的缓存区,如果不想设置数值,此参数可以设为NULL。
(6)lpcbData:指定lpData所设置数据的大小,以字节为单位。
返回值:
如果函数调用成功,它的返回值是ERROR_SUCCESS;如果不成功,返回一个非0的错误码。
使用此函数的具体例子:
RegSetValueEx(hKey, “RegisteredOwner”, NULL, type, value, size);
其中,value是要设置的键值。
在开发软件时有些信息需要保存在注册表中,这就需要在注册表中增加键值。
4. RegCloseKey函数
RegCloseKey函数的作用是关闭已打开的键。RegCloseKey的函数原型如下:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。