【API】注册表编程基础-RegCreateKeyEx、RegSetValueEx

2021-02-13 21:18

阅读:442

1、环境:

 操作系统:Windows 10 x64

 编译器:VS2015

2、关键函数

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

字段说明

  • In HKEY hKey, 打开注册表项的句柄。
  • In LPCTSTR lpSubKey, 一子项,此功能打开或创建名称。
  • Reserved DWORD Reserved, 此参数已保留,必须为零。
  • In_opt LPTSTR lpClass, 此密钥的用户定义类类型。此参数可能被忽略。此参数可以为null。
  • In DWORD dwOptions,

 入参,该参数可以是以下值

    • REG_OPTION_BACKUP_RESTORE,0x00000004L
    • REG_OPTION_NON_VOLATILE,0x00000000L ,一般使用该值
    • REG_OPTION_VOLATILE,0x00000001L
  • In REGSAM samDesired, 定义访问权限
  • In_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 指定要创建的密钥的访问权限的掩码。可选
  • Out PHKEY phkResult, 指向接收到已打开或创建的密钥句柄的变量的指针。
  • Out_opt LPDWORD lpdwDisposition

 出参,可以是以下值。如果为空,则不返回。

    • REG_CREATED_NEW_KEY,0x00000001L 该键是新创建的键
    • REG_OPENED_EXISTING_KEY,0x00000002L 该键是已经存在的键

3、遇到问题

遇到问题1:

 根据写入的返回值确认成功,可是注册表无变化,因为在64位Windows上,部分注册表项分别存储在32位应用程序和64位应用程序中,并使用注册表重定向器和注册表反射映射到单独的逻辑注册表视图,因为64位版本的应用程序可能会使用不同于32位版本的注册表项和值。

遇到问题2:

 写入数据为乱码,因为cbData不能太大,否则很可能把lpData指向的内容之外的其他字符也写入注册表中。

4、代码

// 20180218_注册表编程基础.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 



//用于修改字符串类型键值
void CreateStringReg(HKEY hRoot, wchar_t *szSubKey, wchar_t * ValueName, TCHAR *Data)
{
    HKEY hKey;
    // 打开注册表键,不存在则创建它
    size_t lRet = RegCreateKeyEx(hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, NULL);
    if (lRet != ERROR_SUCCESS)
    {
        printf("error no RegCreateKeyEx %ls\n", szSubKey);
        return;
    }
    // 修改注册表键值,没有则创建它
    size_t iLen = wcslen(Data);
    // 设置键值
    lRet = RegSetValueEx(hKey, ValueName, 0, REG_SZ, (CONST BYTE*)Data, sizeof(TCHAR)*iLen);
    if (lRet != ERROR_SUCCESS)
    {
        printf("error no RegSetValueEx %ls\n", ValueName);
        return;
    }
    RegCloseKey(hKey);
}

int main()
{
    // 要修改成的网址
    TCHAR StartPage[254];
    // 垃圾数据置0
    memset(StartPage, 0, sizeof(StartPage));
    // 赋值字符串到数组中
    wcsncpy_s(StartPage, TEXT("http://www.baidu.com"), 254);

    //调用修改字符串类型键值的函数
    CreateStringReg(HKEY_CURRENT_USER, L"Software\\Microsoft\\Internet Explorer\\Main", L"Start Page", StartPage);
    return 0;
}

5、效果

技术分享图片

6、参考:

How to use RegCreateKeyEx?

https://stackoverflow.com/questions/29115493/how-to-use-regcreatekeyex

32-bit and 64-bit Application Data in the Registry

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx

使用RegSetValueEx修改注册表时遇到的问题(转)

http://www.cnblogs.com/happykoukou/p/8266983.html


评论


亲,登录后才可以留言!