Windows c++ 读写注册表

16 篇文章 1 订阅

背景

在 Windows 上面,我们常用注册表作为一个 cache 来保存一些数据,这样当程序下一次启动的时候,读取注册表,就能获取到上一次缓存的结果

函数介绍

创建指定的注册表项

具体函数

WINADVAPI LSTATUS APIENTRY RegCreateKeyA (
    _In_ HKEY hKey,
    _In_opt_ LPCSTR lpSubKey,
    _Out_ PHKEY phkResult
);

参数介绍 

hKey:打开的注册表项的句柄,一般为 HKEY_CURRENT_USER
lpSubKey:此函数打开或创建的密钥的名称
phkResult:指向接收打开或创建的键的句柄的变量的指针

使用方法

const char* sub_key = "Software\\demo_cache";
HKEY hkey = nullptr;
LSTATUS res = ::RegCreateKeyA(HKEY_CURRENT_USER, sub_key, &hkey);

打开指定的注册表项

具体函数

WINADVAPI LSTATUS APIENTRY RegOpenKeyExA(
    _In_ HKEY hKey,
    _In_opt_ LPCSTR lpSubKey,
    _In_opt_ DWORD ulOptions,
    _In_ REGSAM samDesired,
    _Out_ PHKEY phkResult
);

这里有两个参数和上面不一样,samDesired 表示要进行什么操作,如果是读操作使用 KEY_READ,写操作使用 KEY_WRITE

写入数据

具体函数

LSTATUS RegSetValueExA(
  HKEY       hKey,
  LPCSTR     lpValueName,
  DWORD      Reserved,
  DWORD      dwType,
  const BYTE *lpData,
  DWORD      cbData
);

 参数介绍

hKey:open 时所用到的 HKEY
lpValueName:相当于 key-value 里面的 key
Reserved:保留值,必须强制为0
dwType:被存储数据的类型,如果是字符串使用 REG_SZ
lpData:要存储的数据
cbData:存储数据的长度

读取数据

LSTATUS RegQueryValueExA(
  HKEY    hKey,
  LPCSTR  lpValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE  lpData,
  LPDWORD lpcbData
);

读取数据的时候要调用两遍这个函数

第一遍查询数据的长度,将 lpData 设置为 null,然后返回 lpcbData 就是数据的长度

第二遍查询数据,这个时候需要分配好空间,然后查询数据

关闭指定的注册表

LSTATUS RegCloseKey(
  HKEY hKey
);

hkey 是 open 的时候的 hkey 

具体代码

#include <Windows.h>
#include <atlbase.h>

#include <iostream>
#include <string>
#include <vector>

const char* sub_key = "Software\\demo_cache";
bool SetValue(const std::string& key, const std::string& value) {
    HKEY hkey = nullptr;
    LSTATUS res = ::RegOpenKeyExA(HKEY_CURRENT_USER, sub_key, 0, KEY_WRITE, &hkey);
    if (res != ERROR_SUCCESS) {
        res = ::RegCreateKeyA(HKEY_CURRENT_USER, sub_key, &hkey);
    }
    if (res != ERROR_SUCCESS) {
        return false;
    }
    std::shared_ptr<void> close_key(nullptr, [&](void*) {
        if (hkey != nullptr) {
            ::RegCloseKey(hkey);
            hkey = nullptr;
        }
    });
    res = ::RegSetValueExA(hkey, key.c_str(), 0, REG_SZ, (BYTE*)value.c_str(), value.length());
    if (res != ERROR_SUCCESS) {
        return false;
    }
    return true;
}

std::string GetValue(const std::string& key) {
    HKEY hkey = nullptr;
    LSTATUS res = ::RegOpenKeyExA(HKEY_CURRENT_USER, sub_key, 0, KEY_READ, &hkey);
    if (res != ERROR_SUCCESS) {
        return "";
    }
    std::shared_ptr<void> close_key(nullptr, [&](void*) {
        if (hkey != nullptr) {
            ::RegCloseKey(hkey);
            hkey = nullptr;
        }
    });
    DWORD type = REG_SZ;
    DWORD size = 0;
    res = ::RegQueryValueExA(hkey, key.c_str(), 0, &type, nullptr, &size);
    if (res != ERROR_SUCCESS || size <= 0) {
        return "";
    }
    std::vector<BYTE> value_data(size);
    res = ::RegQueryValueExA(hkey, key.c_str(), 0, &type, value_data.data(), &size);
    if (res != ERROR_SUCCESS) {
        return "";
    }
    return std::string(value_data.begin(), value_data.end());
}

int main(void) {
    bool ret = SetValue("name", "Tom");
    if (ret) {
        std::cout << GetValue("name") << std::endl;
    }
    else {
        std::cout << "set value failed" << std::endl;
    }
    getchar();
    return 0;
}

程序输出

Tom

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C 注册表读写类是一种用于管理和操作Windows操作系统注册表的类。注册表Windows操作系统的核心组件之一,用于存储系统配置和应用程序设置的信息。 C 注册表读写类提供了一组方法和属性,用于读取、写入、修改和删除注册表中的键值。通过使用该类,可以轻松地访问和管理注册表中的数据。该类提供了以下常用的方法: 1. OpenKey:打开一个指定路径的注册表键。 2. CreateKey:创建一个指定路径的注册表键。 3. GetValue:获取指定路径下的键值。 4. SetValue:设置指定路径下的键值。 5. DeleteKey:删除指定路径下的注册表键。 6. DeleteValue:删除指定路径下的键值。 使用C 注册表读写类,可以方便地对注册表进行读写操作,从而实现对应用程序设置和系统配置的管理。比如,可以使用该类来读取和修改系统的默认浏览器设置、时间和日期格式、桌面背景等。同时,也可以使用该类来读取和修改应用程序的配置信息,如保存上一次打开的文件路径、用户界面偏好设置等。 需要注意的是,对注册表读写操作需要管理员权限,因为注册表是系统关键信息的存储位置。在使用该类时,需要确保程序运行在具有管理员权限的账户下,否则可能会导致访问被拒绝的错误。 总之,C 注册表读写类是一个很实用的工具类,可以帮助开发人员轻松地读取和写入注册表中的数据,实现对系统和应用程序设置的管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值