Windows c++ 读写注册表
背景
在 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++ 读写注册表相关推荐
- java读写注册表的两种方式,Preferences与jRegistry
打开注册表方式:电脑上的windows键加r键打开运行程序->输入指令regedit->随即系统便会提示你是否要运行,选择"是"就行了 由于java程序是"w ...
- C#读写注册表及 WOW6432Node 问题
C# 读写注册表技术很成熟,示例代码如下: // Create & Write string regpath = @"Software\MySoft\Soft1"; Reg ...
- Windows 2000/XP 注册表终极修改(转载)
Microsoft Windows 2000/XP 是一个强大的操作系统,为我们提供了以往Windows 9x从未有过的安全性能,可是你是否感觉某些地方的设置还不够呢,这里就对Windows 2000 ...
- 如何通过使用 64 位版本 Windows 查看系统注册表 WOW6432Node
64 位版本 Windows 中的注册表分为 32 位注册表项和 64 位注册表项.许多 32 位注册表项与其相应的 64 位注册表项同名,反之亦然. 64 位版本 Windows 包含的默认 64 ...
- linux应用程序注册表,如何打开 Linux 中 Windows 程序的注册表编辑器
在我们借助CrossOver这款兼容软件在Linux操作系统中运行Windows应用程序的过程中,有的时候我们可能会遇到有关要求,为Windows应用程序设置注册表项的疑难解答问题的提示,指南或说明. ...
- Windows 输入法在注册表中的管理
Windows 输入法在注册表中的管理 查看语言栏的输入法 法一 法二 查看默认输入法 找到默认输入法的 CLSID 根据 CLSID 查找对应的输入法 WINDOWS下输入法中英文切换 切换输入法半 ...
- QSettings 读写注册表、配置文件
简述 一般情况下,我们在开发软件过程中,都会缓存一些信息到本地,可以使用轻量级数据库sqlite,也可以操作注册表.读写配置文件. 关于QSettings的使用前面已经介绍过了,比较详细,见" ...
- [windows]如何打开注册表编辑器
[windows]如何打开注册表编辑器 第一种 第二种 第三种 第一种 键盘按 win+r 输入regedit 回车即可 第二种 在任务栏上的搜索框中,键入"regedit".然后 ...
- [windows]立即刷新注册表
[windows]立即刷新注册表 1.新建文本文件,将下边代码写入文本中 2.修改后缀名未bat并执行即可 1.新建文本文件,将下边代码写入文本中 @echo off taskkill /im exp ...
最新文章
- 开源websocket
- 一文读懂QEMU虚拟机
- USTC English Club Note20171016(2)
- go语言调用python_Golang中调用Python3
- 使用双重循环,输出数字金字塔
- 几何画板200个经典课件_项目制学科联动 | 金芬娥首席工作室:灵动“画板”,研修创新,协同进步...
- oracle之基本的过滤和排序数据之课后练习
- 网络层:IP协议详解(IP协议真的得看这篇)
- Java大数据你该学哪个
- android横向滑动控件,Android学习——HorizontalScollview水平滚动控件
- Jupyter编程完成对手写体Mnist数据集中10个字符 (0-9)的分类识别
- 数据库的海量数据的存储解析
- Lytain:PCWin10纯净专业版重装与程序员的高效部署
- LINUX - 实时LINUX内核(PREEMPT_RT)的编译安装以及测试
- 别让用户发呆—设计中的防呆策略[转]
- SQL Server 使用数据库发送邮件(sp_send_dbmail)
- B站再出争议,大会员提前三天扣费,这波小破站赚了多少?
- 安卓仿手机网易新闻app项目开发系列之(二)轮播图显示和RecyclerView适配器编写
- 用python编写缠论中枢_【缠论】python 实现
- kmeans聚类算法matlab实现
热门文章
- 【苹果iMessage家庭推】 打开下载的证书文件,一样平常会主动用钥匙串访问程序打开的选择iOS App Development是开发证书
- 1.1.10 word2010图片另存为存到图片库里,怎么修改之
- 各行业领域的企业如何使用数据分析
- PPT之动作按钮和超链接
- 【python爬虫自学笔记】-----爬取网易云歌单中歌曲歌词
- 2D照片制作3D特效动画AE模板 3D照片动画
- mysql 导致锁表 count_mysql count 锁表
- 报告!这群阿里工程师在偷偷养猪
- 世界各国边界线geojson
- 【网站搭建】阿里云服务器ECS及域名购买、解析