新闻中心

C++如何操作注册表_Windows平台下C++读写注册表的API函数详解

2025-12-01
浏览次数:
返回列表
答案:在Windows下,C++通过RegOpenKeyEx、RegCreateKeyEx、RegQueryValueEx、RegSetValueEx等API操作注册表,实现对注册表项的打开、创建、读取、写入及删除,需注意权限和资源释放。

c++如何操作注册表_windows平台下c++读写注册表的api函数详解

在Windows平台下,C++可以通过调用Windows API来操作注册表。注册表是Windows操作系统中用于存储系统、应用程序和用户配置信息的核心数据库。通过API函数,程序可以读取、写入、创建或删除注册表项和值。

1. 打开注册表项(RegOpenKeyEx)

要访问一个已存在的注册表项,需要使用 RegOpenKeyEx 函数。

LONG RegOpenKeyEx(
  HKEY   hKey,            // 父键句柄,如 HKEY_LOCAL_MACHINE
  LPCTSTR lpSubKey,      // 子键名称
  DWORD  ulOptions,       // 保留,通常为0
  REGSAM samDesired,      // 访问权限,如 KEY_READ、KEY_WRITE
  PHKEY  phkResult        // 接收打开的子键句柄
);

示例:打开 HKEY_LOCAL_MACHINESOFTWAREMyApp

HKEY hKey;
LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\MyApp"),
  0, KEY_READ, &hKey);
if (result == ERROR_SUCCESS) {
  // 成功打开
} else {
  // 打开失败
}

2. 创建或打开注册表项(RegCreateKeyEx)

如果目标注册表项可能不存在,应使用 RegCreateKeyEx,它会尝试打开,若不存在则创建。

LONG RegCreateKeyEx(
  HKEY   hKey,
  LPCTSTR lpSubKey,
  DWORD  Reserved,
  LPTSTR lpClass,
  DWORD  dwOptions,
  REGSAM samDesired,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  PHKEY  phkResult,
  LPDWORD lpdwDisposition
);

常用参数说明:

  • dwOptions:可设为 REG_OPTION_NON_VOLATILE(持久保存)
  • lpdwDisposition:返回是新建还是已存在(REG_CREATED_NEW_KEY 或 REG_OPENED_EXISTING_KEY)

示例:创建或打开 MyCompany 键

HKEY hKey;
DWORD disposition;
LONG result = RegCreateKeyEx(HKEY_CURRENT_USER,
  TEXT("SOFTWARE\MyCompany"), 0, NULL, 0,
  KEY_WRITE, NULL, &hKey, &disposition);
if (result == ERROR_SUCCESS) {
  if (disposition == REG_CREATED_NEW_KEY)
    // 新建成功
  else
    // 已存在并打开
  RegCloseKey(hKey);
}

3. 读取注册表值(RegQueryValueEx)

使用 RegQueryValueEx 读取指定键下的值数据。

LONG RegQueryValueEx(
  HKEY    hKey,
  LPTSTR  lpValueName,
  LPDWORD lpReserved,
  LPDWORD lpType,
  LPBYTE  lpData,
  LPDWORD lpcbData
);

关键点:

  • lpType 返回数据类型,如 REG_SZ、REG_DWORD、REG_BINARY
  • lpcbData 初始时传入缓冲区大小,调用后更新为实际字节数

示例:读取一个字符串值

HKEY hKey;
TCHAR buffer[256];
DWORD bufferSize = sizeof(buffer);
LONG result = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\MyApp"), 0, KEY_READ, &hKey);
if (result == ERROR_SUCCESS) {
  result = RegQueryValueEx(hKey, TEXT("InstallPath"), NULL, NULL,
    (LPBYTE)buffer, &bufferSize);
  if (result == ERROR_SUCCESS) {
    // buffer 中即为路径字符串
  }
  RegCloseKey(hKey);
}

4. 写入注册表值(RegSetValueEx)

使用 RegSetValueEx 设置某个键的值。

ChatGPT Writer ChatGPT Writer

免费 Chrome 扩展程序,使用 ChatGPT AI 生成电子邮件和消息。

ChatGPT Writer 106 查看详情 ChatGPT Writer
LONG RegSetValueEx(
  HKEY   hKey,
  LPCTSTR lpValueName,
  DWORD  Reserved,
  DWORD  dwType,
  const BYTE* lpData,
  DWORD  cbData
);

常见类型:

  • REG_SZ:以 结尾的字符串
  • REG_DWORD:32位整数
  • REG_QWORD:64位整数
  • REG_MULTI_SZ:多个字符串组成的数组

示例:写入安装路径

HKEY hKey;
LONG result = RegCreateKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\MyApp"),
  0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL);
if (result == ERROR_SUCCESS) {
  TCHAR path[] = TEXT("C:\MyApp");
  RegSetValueEx(hKey, TEXT("InstallPath"), 0, REG_SZ,
    (const BYTE*)path, (lstrlen(path)+1)*sizeof(TCHAR));
  RegCloseKey(hKey);
}

5. 删除注册表项或值

删除值使用 RegDeleteValue,删除子键使用 RegDeleteKey

删除值:

RegDeleteValue(hKey, TEXT("OldValue"));

删除空子键:

RegDeleteKey(HKEY_CURRENT_USER, TEXT("SOFTWARE\MyApp\Temp"));

注意:被删除的键必须为空,否则删除失败。

6. 关闭注册表句柄(RegCloseKey)

每次成功打开或创建注册表键后,必须使用 RegCloseKey 关闭句柄,防止资源泄漏。

RegCloseKey(hKey);

基本上就这些。掌握这几个核心API,就能在C++中灵活操作Windows注册表。注意权限问题,在某些系统位置(如 HKEY_LOCAL_MACHINE)写入可能需要管理员权限。同时建议操作前备份关键注册表项,避免误操作导致系统问题。

以上就是C++如何操作注册表_Windows平台下C++读写注册表的API函数详解的详细内容,更多请关注其它相关文章!


# c++  # 打开注册表  # 类中  # 如何使用  # 回调  # 句柄  # red  # win  # amd  # 字节  # app  # 操作系统  # windows  # go  # word  # 注册表  # mac  # 如何推广营销棉花糖  # 天猫店软文推广营销  # 宝鸡做推广网站怎么样啊  # seo域名与程序  # 翔安网站建设系统  # 代做seo包年优化  # 揭阳seo优化厂商  # 百度网站制作优化  # 安阳网站的推广  # seo关键词什么牌子好  # 设为  # 如何在  # 多个 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  Safari自带网页翻译功能怎么用 无需插件轻松看懂外文网站【方法】  铁路12306卧铺选择攻略 铁路12306下铺座位预定技巧  打开就能玩的植物大战僵尸 植物大战僵尸网页版传送门  MongoDB聚合管道:正确匹配对象数组中_id的方法  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  谷歌学术网站直达地址 谷歌学术搜索网页版一键进入  Angular Material 垂直步进器:实现底部到顶部排序的教程  Win10桌面图标出现小盾牌怎么办 Win10去除UAC图标教程【解决】  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  曝R星经典之作开发图 设计简陋但信息密集!  J*a中实现Go语言select通道多路复用机制  2025-2030年全球乘用车销量预测:新能源成增长主力  蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源  必由学官方平台入口 必由学在线课堂登录地址  在Pyomo中实现基于变量的条件约束:Big-M方法详解  PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符  Win11怎么开启卓越性能模式 Win11电源选项启用高性能释放硬件潜力【方法】  学习通网页版快速入口 学习通官网网页版直接打开  Python:递归比较文件夹内容并找出特定类型文件的差异  Mac终端命令大全_Mac常用Terminal指令速查  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  QQ邮箱在线登录平台 QQ邮箱个人邮箱网页版入口  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  微信聊天记录怎么加密_微信聊天记录加密方法  谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法  微信网页版官方快速登录入口 微信网页版网页版账号直达  蓝湖怎样用切图标注提对接效率_蓝湖用切图标注提对接效率【设计对接】  使用 Pandas 高效处理 .dat 文件:字符清理与数据计算  漫蛙网页登录入口 漫蛙漫画官方授权网址  Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践  小米Civi 4录制视频过暗_小米Civi 4亮度优化  2026春节假期票务安排_2026春节放假购票指南  QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  J*a最大堆Heapify方法修复:索引计算与边界条件深度解析  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  荣耀Play7TPro怎样在信息App置顶客服对话_iPhone荣耀Play7TPro信息App置顶客服对话【优先查看】  深入理解J*a链表中的IPosition接口与使用  QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台  Composer如何在生产环境安全地执行composer update  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  电脑IP地址怎么查 查看本机IP地址的几种方法  J*aScript Promise链中如何正确终止后续.then执行并处理错误  CSS自定义字体样式被系统字体替换怎么办_font-face方式指定font-display控制渲染策略  Pandas DataFrame 多条件优先级排序与排名  word中如何让数字纵向排列_Word数字纵向排列方法  css子元素高度不一致导致布局错位怎么办_使用align-items:stretch解决高度差异 

搜索