windows c++ 操作注册表依赖 RegopenKeyEx、RegQueryValueEx、RegSetValueEx、RegCreateKeyEx 和 RegCloseKey 等 API;需注意权限、错误检查、Unicode 编码及字节长度(非字符数),HKEY_LOCAL_macHINE 通常需管理员权限。

windows C++ 操作注册表主要靠 Windows API 提供的一组函数,核心是 RegOpenKeyEx、RegQueryValueEx、RegSetValueEx、RegCreateKeyEx 和 RegCloseKey。不需要第三方库,但要注意权限、错误检查和字符串编码(推荐用 Unicode / wchar_t)。
打开或创建注册表键(RegOpenKeyEx / RegCreateKeyEx)
注册表操作前必须先获取键句柄。常用根键有 HKEY_LOCAL_MACHINE、HKEY_CURRENT_USER 等。
- 只读打开已有键:用
RegOpenKeyEx,指定访问权限如KEY_READ;失败返回非零错误码,需检查 - 确保键存在(不存在则创建):用
RegCreateKeyEx,传入KEY_WRITE或KEY_ALL_access;若父键不存在会逐级创建(需足够权限) - 路径中不要加开头的反斜杠,例如
L"Software\Myapp"是对的,L"\Software\MyApp"会失败
读取注册表值(RegQueryValueEx)
读取前需知道值名(value name)、数据类型(如 REG_SZ、REG_Dword)和缓冲区大小。
- 建议先调用一次
RegQueryValueEx传入nullptr的缓冲区,获取所需大小(lpcbData输出) - 再分配内存(注意
REG_SZ是宽字符字符串,结尾有双 ;REG_DWORD直接读 4 字节) - 常见类型对应 C++ 类型:
REG_DWORD→DWORD,REG_QWORD→ULONGLONG,REG_SZ→wchar_t*
写入注册表值(RegSetValueEx)
写入时必须保证目标键已打开且有写权限(如用 RegCreateKeyEx 打开)。
立即学习“C++免费学习笔记(深入)”;
-
RegSetValueEx第 5 个参数是数据指针,第 6 个是字节数(不是字符数!wcslen(str)*sizeof(wchar_t)+sizeof(wchar_t)才是完整字符串长度) - 写入
REG_SZ时务必包含结尾的空字符,否则读取可能乱码或截断 - 写入失败常见原因:权限不足(尤其
HKEY_LOCAL_MACHINE需管理员)、键只读打开、路径不存在、数据长度不匹配
关闭句柄与错误处理
每次成功调用 RegOpenKeyEx 或 RegCreateKeyEx 后,必须配对调用 RegCloseKey,否则资源泄漏。
- 所有注册表 API 返回
LONG,成功为ERROR_SUCCESS(即 0),其余均为错误码 - 可用
FormatMessage将错误码转为可读字符串用于调试 - 修改
HKEY_LOCAL_MACHINE通常需要以管理员身份运行程序;HKEY_CURRENT_USER一般无需提权
基本上就这些。注册表操作不复杂但容易忽略权限和字符串长度细节,写之前多看 MSDN 对应函数的参数说明,尤其 lpcbData 和 cbData 的单位是字节。