当前位置:C++技术网 > 资讯 > 注册表编程系列:2 打开和关闭注册表键

注册表编程系列:2 打开和关闭注册表键

更新时间:2015-06-24 00:17:14浏览次数:1+次

    在操作注册表前,需要打开注册表,得到操作的注册表的相应注册表键的句柄,这样才可以通过句柄操作。操作完后,需要关闭注册表,释放注册表句柄。这样就完成一个打开和关闭的整个功能逻辑。
    使用的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);