Windows中注册表的读写

本文详细介绍了Windows注册表的基本概念和作用,包括如何使用API进行注册表项的创建、打开、读取和写入操作。通过示例代码展示了如何在C++中设置和获取注册表值。

https://blog.51cto.com/u_12204415/3979364

  1. 什么是windows注册表
    注册表就是存储Windows选项和配置设置的数据库。 该注册表用于存储信息和软件设置,用户首选项,操作系统或硬件设备的配置等。
  2. 注册表的作用:
    在 Windows 上面,我们常用注册表作为一个 cache 来保存一些数据,这样当程序下一次启动的时候,读取注册表,就能获取到上一次缓存的结果。
  3. 注册表读写的<windows.h>相关API
  • 创建注册表项
WINADVAPI LSTATUS APIENTRY RegCreateKeyA (
    _In_ HKEY hKey,  //打开的注册表项的句柄,一般为 HKEY_CURRENT_USER
    _In_opt_ LPCSTR lpSubKey,  //此函数打开或创建的密钥的名称
    _Out_ PHKEY phkResult  //指向接收打开或创建的键的句柄的变量的指针
);
  • 打开指定的注册表项
WINADVAPI LSTATUS APIENTRY RegOpenKeyExA(
    _In_ HKEY hKey,
    _In_opt_ LPCSTR lpSubKey,
    _In_opt_ DWORD ulOptions,
    _In_ REGSAM samDesired,  //samDesired 表示要进行什么操作,为KEY_READ/KEY_WRITE
    _Out_ PHKEY phkResult
);
  • 向注册表中添加数据
LSTATUS RegSetValueExA(
  HKEY       hKey,
  LPCSTR     lpValueName,  //相当于 key-value 里面的 key
  DWORD      Reserved, //保留值,必须强制为0
  DWORD      dwType,  //被存储数据的类型,如果是字符串使用 REG_SZ
  const BYTE *lpData,  //要存储的数据
  DWORD      cbData  //存储数据的长度
);
  • 读取注册表中的数据
LSTATUS RegQueryValueExA(
  HKEY    hKey,
  LPCSTR  lpValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE  lpData,
  LPDWORD lpcbData
);
读取数据的时候要调用两遍这个函数

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

第二遍查询数据,这个时候需要分配好空间,然后查询数据
  • 关闭注册表
LSTATUS RegCloseKey(
  HKEY hKey
);
  1. 注册表API用例
	#include"iostream"
using namespace std;
#include <windows.h>
#include <vector>

const char* sub_key = "Software\\demo";
bool SetValue(const string& key, const string& value) {
    HKEY hkey = NULL;
    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;
    }

    shared_ptr<void> close_key(NULL, [&](void*) {
        if (hkey != NULL) {
            ::RegCloseKey(hkey);
            hkey = NULL;
        }
    });

    res = ::RegSetValueExA(hkey, key.c_str(), 0, REG_SZ, (BYTE*)value.c_str(), value.length());
    if (res != ERROR_SUCCESS) {
        return false;
    }
    return true;
}

string GetValue(const string& key) {
    HKEY hkey = NULL;
    LSTATUS res = ::RegOpenKeyExA(HKEY_CURRENT_USER, sub_key, 0, KEY_READ, &hkey);
    if (res != ERROR_SUCCESS) {
        return "";
    }

    shared_ptr<void> close_key(NULL, [&](void*) {
        if (hkey != NULL) {
            ::RegCloseKey(hkey);
            hkey = NULL;
        }
    });

    DWORD type = REG_SZ;
    DWORD size = 0;
    //第一次查询获取数据的长度
    res = ::RegQueryValueExA(hkey, key.c_str(), 0, &type, NULL, &size);
    if (res != ERROR_SUCCESS || size <= 0) {
        return "";
    }
    vector<BYTE> value_data(size);
    res = ::RegQueryValueExA(hkey, key.c_str(), 0, &type, value_data.data(), &size);
    if (res != ERROR_SUCCESS) {
        return "";
    }
    return string(value_data.begin(), value_data.end());
}


int main() {
    const string key = "name";
    const string value = "zmm";
    bool ret = SetValue(key, value);
    if (ret) {
        cout << GetValue(key) << endl;
    } else {
        cout << "failed!" << endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值