背景

在 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

Windows c++ 读写注册表相关推荐

  1. java读写注册表的两种方式,Preferences与jRegistry

    打开注册表方式:电脑上的windows键加r键打开运行程序->输入指令regedit->随即系统便会提示你是否要运行,选择"是"就行了 由于java程序是"w ...

  2. C#读写注册表及 WOW6432Node 问题

    C# 读写注册表技术很成熟,示例代码如下: // Create & Write string regpath = @"Software\MySoft\Soft1"; Reg ...

  3. Windows 2000/XP 注册表终极修改(转载)

    Microsoft Windows 2000/XP 是一个强大的操作系统,为我们提供了以往Windows 9x从未有过的安全性能,可是你是否感觉某些地方的设置还不够呢,这里就对Windows 2000 ...

  4. 如何通过使用 64 位版本 Windows 查看系统注册表 WOW6432Node

    64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项.许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然. 64 位版本 Windows 包含的默认 64 ...

  5. linux应用程序注册表,如何打开 Linux 中 Windows 程序的注册表编辑器

    在我们借助CrossOver这款兼容软件在Linux操作系统中运行Windows应用程序的过程中,有的时候我们可能会遇到有关要求,为Windows应用程序设置注册表项的疑难解答问题的提示,指南或说明. ...

  6. Windows 输入法在注册表中的管理

    Windows 输入法在注册表中的管理 查看语言栏的输入法 法一 法二 查看默认输入法 找到默认输入法的 CLSID 根据 CLSID 查找对应的输入法 WINDOWS下输入法中英文切换 切换输入法半 ...

  7. QSettings 读写注册表、配置文件

    简述 一般情况下,我们在开发软件过程中,都会缓存一些信息到本地,可以使用轻量级数据库sqlite,也可以操作注册表.读写配置文件. 关于QSettings的使用前面已经介绍过了,比较详细,见" ...

  8. [windows]如何打开注册表编辑器

    [windows]如何打开注册表编辑器 第一种 第二种 第三种 第一种 键盘按 win+r 输入regedit 回车即可 第二种 在任务栏上的搜索框中,键入"regedit".然后 ...

  9. [windows]立即刷新注册表

    [windows]立即刷新注册表 1.新建文本文件,将下边代码写入文本中 2.修改后缀名未bat并执行即可 1.新建文本文件,将下边代码写入文本中 @echo off taskkill /im exp ...

最新文章

  1. 开源websocket
  2. 一文读懂QEMU虚拟机
  3. USTC English Club Note20171016(2)
  4. go语言调用python_Golang中调用Python3
  5. 使用双重循环,输出数字金字塔
  6. 几何画板200个经典课件_项目制学科联动 | 金芬娥首席工作室:灵动“画板”,研修创新,协同进步...
  7. oracle之基本的过滤和排序数据之课后练习
  8. 网络层:IP协议详解(IP协议真的得看这篇)
  9. Java大数据你该学哪个
  10. android横向滑动控件,Android学习——HorizontalScollview水平滚动控件
  11. Jupyter编程完成对手写体Mnist数据集中10个字符 (0-9)的分类识别
  12. 数据库的海量数据的存储解析
  13. Lytain:PCWin10纯净专业版重装与程序员的高效部署
  14. LINUX - 实时LINUX内核(PREEMPT_RT)的编译安装以及测试
  15. 别让用户发呆—设计中的防呆策略[转]
  16. SQL Server 使用数据库发送邮件(sp_send_dbmail)
  17. B站再出争议,大会员提前三天扣费,这波小破站赚了多少?
  18. 安卓仿手机网易新闻app项目开发系列之(二)轮播图显示和RecyclerView适配器编写
  19. 用python编写缠论中枢_【缠论】python 实现
  20. kmeans聚类算法matlab实现

热门文章

  1. 【苹果iMessage家庭推】 打开下载的证书文件,一样平常会主动用钥匙串访问程序打开的选择iOS App Development是开发证书
  2. 1.1.10 word2010图片另存为存到图片库里,怎么修改之
  3. 各行业领域的企业如何使用数据分析
  4. PPT之动作按钮和超链接
  5. 【python爬虫自学笔记】-----爬取网易云歌单中歌曲歌词
  6. 2D照片制作3D特效动画AE模板 3D照片动画
  7. mysql 导致锁表 count_mysql count 锁表
  8. 报告!这群阿里工程师在偷偷养猪
  9. 世界各国边界线geojson
  10. 【网站搭建】阿里云服务器ECS及域名购买、解析