C++中如何操作Windows注册表_C++读取与写入注册表键值对教程【系统】-C++

windows注册表操作必须使用windows api,不可用标准库;需正确处理根键、权限、缓冲区大小、字符串编码及句柄关闭。

Windows 注册表在 C++ 中不能直接用标准库操作,必须调用 Windows API 的 RegOpenKeyEx、RegQueryValueEx、RegSetValueEx 等函数;不处理错误码、不关闭句柄、忽略权限问题,90% 的注册表操作会失败或静默失效。

用 RegOpenKeyEx 打开注册表路径前必须确认根键和访问权限

注册表路径如 HKEY_LOCAL_MACHINESOFTWAREMyApp 不能直接传给 API —— 根键(如 HKEY_LOCAL_MACHINE)是预定义句柄,路径部分必须拆出来单独传参。同时,REGSAM 权限标志不能硬写 KEY_ALL_ACCESS:普通用户进程默认无权写入 HKEY_LOCAL_MACHINE,应按需选择 KEY_READ 或 KEY_WRITE,写入时优先尝试 HKEY_CURRENT_USER。

  • 读取示例:RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\MyApp", 0, KEY_READ, &hKey)
  • 写入示例(需管理员权限):RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\MyApp", 0, KEY_WRITE, &hKey)
  • 若返回 ERROR_ACCESS_DENIED,别强行提权,改用 HKEY_CURRENT_USER 存储用户级配置

RegQueryValueEx 读取值时必须先获取缓冲区大小,否则容易崩溃

注册表值类型多样(REG_SZ、REG_DWORD、REG_QWORD 等),RegQueryValueEx 第一次调用常用来“试探”数据长度,此时传入 nullptr 和 0 给缓冲区参数,API 会通过 lpcbData 返回所需字节数。跳过这步直接分配固定大小缓冲区,对字符串易截断,对二进制数据则可能越界读。

  • 正确流程:先调用一次获取 dwSize,再 new BYTE[dwSize],再第二次调用真正读取
  • 读 REG_DWORD 可简化:DWORD dwVal; RegQueryValueEx(hKey, L"Timeout", nullptr, nullptr, (LPBYTE)&dwVal, sizeof(dwVal))
  • 读 REG_SZ 注意:返回的是 UTF-16 字符串,末尾有双 ,std::wstring 构造时要用 size / sizeof(wchar_t) 计算字符数

RegSetValueEx 写入字符串或数字时类型与缓冲区必须严格匹配

写入值的 dwType 参数必须与实际数据类型一致,且 lpData 指向的数据布局要符合该类型规范。常见错误是把 std::string 直接传给 REG_SZ,或把 int 地址传给 REG_DWORD 却忘了指针解引用。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++中如何操作Windows注册表_C++读取与写入注册表键值对教程【系统】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1394+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4049015+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1394+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4049016+
  • 本周更新: 0+
  • 最后更新: 2026-03-16