曲径通幽论坛

标题: RegOpenKeyEx() -- 打开已经存在的键 [打印本页]

作者: beyes    时间: 2013-4-16 10:43
标题: RegOpenKeyEx() -- 打开已经存在的键
RegOpenKeyEx() 函数用来打开注册表已经存在的键,其原型如下:
LONG WINAPI RegOpenKeyEx(
  __in        HKEY hKey,
  __in_opt    LPCTSTR lpSubKey,
  __reserved  DWORD ulOptions,
  __in        REGSAM samDesired,
  __out       PHKEY phkResult
);
第 1 个参数 hKey 是输入参数,表示要打开的键,可以是 RegCreateKeyEx() 或者是 RegOpenKeyEx() 等函数的返回值。它还可以是下面几个预定义键之一:
HKEY_CLASSES_ROOT
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

第 2 个参数 lpSubKey 是个输入参数,表示的是子键名称字符串,比如:HKEY_CURRENT_USER 键下面的 “Software\Kingsoft\Antivirus” (安装过金山毒霸才有的键)。

第 3 个参数 ulOptions 是系统保留参数,调用时设置为 0 。

第  4 个参数 samDesired  是输入参数,表示存取权限,比如读,写这种权限,具体的权限描述可参考 SDK 文档。

第 5 个参数 phkResult 是输出参数,指向保存键句柄的 HKEY 类型的变量。在用 RegCloseKey() 关闭键时就会用到这个值。

函数的返回值是 LONG 类型,成功时返回 ERROR_SUCCESS ,否则可用FormatMessage()  函数设置 FORMAT_MESSAGE_FROM_SYSTEM 来获取错误信息。

测试代码:
[C++] 纯文本查看 复制代码
#include "stdafx.h"
#include <Windows.h>
#include <Winreg.h>

void Add_Key(HKEY hKey)
{
    HKEY hSubKey;
    DWORD dwKeyValue = 110;

    RegCreateKey(hKey, TEXT("RegAdder"), &hSubKey);

    if ( ERROR_SUCCESS != RegSetValueEx(hSubKey, TEXT("TEST"), NULL, REG_DWORD, (const byte*)&dwKeyValue, sizeof(DWORD))) {
        printf ("Error\n");
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    HKEY hMyTestKey;

    if ( RegOpenKeyEx ( HKEY_CURRENT_USER, TEXT("SOFTWARE"),
                        0, KEY_READ | KEY_WRITE,
                        &hMyTestKey) == ERROR_SUCCESS)
    {
        Add_Key(hMyTestKey);

    }

    return 0;
}

运行该程序后,再使用注册表编辑器 regedit 来观察一下是否创建了相应的键及键值:
[attach]1517[/attach]
由上图可见设置是正确的。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2