在操作注册表前,需要打开注册表,得到操作的注册表的相应注册表键的句柄,这样才可以通过句柄操作。操作完后,需要关闭注册表,释放注册表句柄。这样就完成一个打开和关闭的整个功能逻辑。
使用的API函数为:
RegOpenKeyEx:打开注册表键
RegCloseKey :关闭注册表键
打开注册表键函数:
LONG RegOpenKeyEx(
HKEY hKey, // 注册表键句柄
LPCTSTR lpSubKey, // 子键名字
DWORD ulOptions, // 保留项
REGSAM samDesired, // 安全访问掩码
PHKEY phkResult // 接收打开句柄的地址或者指针
);
返回值LONG类型的是返回错误码,执行成功,返回ERROR_SUCCESS,如果失败,则是具体的错误码.可以使用FormatMessage函数得到具体的错误描述.
HKEY hKey:
第一次打开时,必然是根键的其中一个,然后就得到一个键句柄.以后可以将此句柄传入第一个参数来打开此根键下的子键.如果有子键句柄,则可以打开子键下面的子键句柄.依次类推.而第一次打开则需要传入预定义的键值宏.如下:
键值宏:
HKEY_CLASSES_ROOT :基础类根
HKEY_CURRENT_CONFIG:当前配置
HKEY_CURRENT_USER :当前用户
HKEY_LOCAL_MACHINE :本地计算机
HKEY_USERS :所有用户
Windows NT/2000/XP: HKEY_PERFORMANCE_DATA :性能数据
Windows 95/98/Me: HKEY_DYN_DATA :动态数据
你可以在任意一个根键下面建立自定义的键.不过,每一个根键都有特定意义的,因此根据类型在不同的根键下建立自定义的键是个好习惯。每个根键的具体意义可以百度查阅一下,有详细解释。
LPCTSTR lpSubKey:
每一个子键都是有一个默认的空键项的。在传入字符串参数时,把子键当做是文件夹的结构一样来处理。子键的子键则使用\\拼接在字符串中。如"子键1\\子键11".如果此参数为空,则只打开第一个参数得到的键句柄。这里多说一句,第一个参数相当于第一级文件夹,如果第二个参数传入空,相当于只打开第一级文件夹而已,如果第二个参数传入一个子文件夹的路径,则直接打开得到这个子文件夹的句柄。这里就把子文件夹替换成子键就可以很好的理解了。
DWORD ulOptions:
保留项,必须为0.
REGSAM samDesired:
访问的权限标志。有如下选项:
KEY_CREATE_LINK:允许创建符号链接
KEY_CREATE_SUB_KEY :允许创建子键
KEY_ENUMERATE_SUB_KEYS :允许枚举子键
KEY_EXECUTE :允许执行
KEY_NOTIFY :允许改变通知
KEY_QUERY_VALUE :允许查询子键数据
KEY_SET_VALUE :允许修改子键数据
KEY_ALL_ACCESS :包含 KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, KEY_NOTIFY, KEY_CREATE_SUB_KEY, KEY_CREATE_LINK, 和KEY_SET_VALUE 访问权限, 加上所有的标准访问权限,除了SYNCHRONIZE. 一般理解为全部权限。
KEY_READ :包含 STANDARD_RIGHTS_READ, KEY_QUERY_VALUE, KEY_ENUMERATE_SUB_KEYS, 和 KEY_NOTIFY 访问权限
KEY_WOW64_64KEY Windows XP: 允许64位或者32位程序打开64位键
KEY_WOW64_32KEY Windows XP: 允许64位或者32位程序打开32位键
KEY_WRITE :包含STANDARD_RIGHTS_WRITE, KEY_SET_VALUE, 和KEY_CREATE_SUB_KEY权限
PHKEY phkResult:
一个键句柄地址或者指针,用来接收打开的句柄。操作完后,要将指针指向的句柄关闭掉。
需要注意的一点,此函数只是打开一个已有的键句柄。如果此句柄不存在,则打开失败,而不会创建一个句柄。如果不存在句柄需要创建一个时,调用RegCreateKeyEx来创建句柄。
关闭句柄使用RegCloseKey函数。此函数只接受一个句柄值。完成关闭此句柄的操作。关闭成功返回ERROR_SUCCESS,失败则是具体的错误码。可以使用FormatMessage函数得到具体的错误描述.
判断条件就是与ERROR_SUCCESS比较,相同则成功,不相同则失败。
代码样例:
HKEY hKey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SYSTEM\\CurrentControlSet\\Control\\ProductOptions"),
0, KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS) return FALSE;
RegCloseKey(hKey);