曲径通幽论坛

标题: RegCreateKeyEx()/RegCreateKey() -- 新建子键 [打印本页]

作者: beyes    时间: 2013-4-18 00:14
标题: RegCreateKeyEx()/RegCreateKey() -- 新建子键
RegCreateKeyEx() 函数用来新建一个键,如果该键已经存在,那么就打开该键。注意,键名大小写不敏感。原型如下:
LONG WINAPI RegCreateKeyEx(
  __in        HKEY hKey,
  __in        LPCTSTR lpSubKey,
  __reserved  DWORD Reserved,
  __in_opt    LPTSTR lpClass,
  __in        DWORD dwOptions,
  __in        REGSAM samDesired,
  __in_opt    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  __out       PHKEY phkResult,
  __out_opt   LPDWORD lpdwDisposition
);
第 1 个参数 hKey 是个输入参数,是一个已经打开键的句柄。之前被打开的键必须要以 KEY_CREATE_SUB_KEY 的访问权限打开,这样在调用该函数时才能创建一个新的子键。这个句柄由 RegCreateKeyEx() 或 RegOpenKeyEx()  函数返回,或者是下面预定义键中的一个:
HKEY_CLASSES_ROOT
HKEY_CURRENT_CONFIG
HKEY_CURRENT_USER
HKEY_LOCAL_MACHINE
HKEY_USERS

第 2 个参数 lpSubKey 是输入参数,是欲新建子键的名字,它必须是 kHey 指定键的子键,并且该参数不能为 NULL 。

第 3 个参数 Reserved 保留,必须为 0 。

第 4 个参数 lpClass 是用户为键自定义的一个类类型。建议用 NULL 。

第 5 个参数 dwOptions 通常取 0 值( REG_OPTION_NON_VOLATILE),另一个与之相反的值是 REG_OPTION_VOLATILE 。非易挥发(Nonvolatile)的注册表信息会存在在文件中,并且在系统重启时也会得到保存;而易挥发注册表键则是保存在内存中,系统重启时则随之丢失。

第 6 个参数 samDesired 和 RegOpenKeyEx() 函数中的一样。

第 7 个参数 lpSecurityAttributes 是安全属性指针,如果为 NULL,那么返回的句柄将不会被子进程所继承。

第 8 个参数 phkResult 是个输出参数,用以要创建的子键的句柄。

第 9 个参数 lpdwDisposition 是个输出参数,为一个 DWORD 类型变量指针,它会告诉你你要创建的键是已经存在的还是未存在并被创建的。

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

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

    RegCreateKeyEx(hKey, _T("RegAdder"), 0, NULL, NULL,KEY_READ | KEY_WRITE, NULL, &hSubKey, NULL);

    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;
}

运行该程序,然后观察注册表是否创建相应的子键及键值是否成功:

在打开注册表时,你可能需要刷新(F5)一下才能看到结果。

此外,对于老的 RegCreateKey() 函数示例可参考:http://www.groad.net/bbs/read.php?tid-7731.html




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