https://blog.51cto.com/u_12204415/3979364
- 什么是windows注册表
注册表就是存储Windows选项和配置设置的数据库。 该注册表用于存储信息和软件设置,用户首选项,操作系统或硬件设备的配置等。 - 注册表的作用:
在 Windows 上面,我们常用注册表作为一个 cache 来保存一些数据,这样当程序下一次启动的时候,读取注册表,就能获取到上一次缓存的结果。 - 注册表读写的<windows.h>相关API
- 创建注册表项
WINADVAPI LSTATUS APIENTRY RegCreateKeyA (
_In_ HKEY hKey, //打开的注册表项的句柄,一般为 HKEY_CURRENT_USER
_In_opt_ LPCSTR lpSubKey, //此函数打开或创建的密钥的名称
_Out_ PHKEY phkResult //指向接收打开或创建的键的句柄的变量的指针
);
- 打开指定的注册表项
WINADVAPI LSTATUS APIENTRY RegOpenKeyExA(
_In_ HKEY hKey,
_In_opt_ LPCSTR lpSubKey,
_In_opt_ DWORD ulOptions,
_In_ REGSAM samDesired, //samDesired 表示要进行什么操作,为KEY_READ/KEY_WRITE
_Out_ PHKEY phkResult
);
- 向注册表中添加数据
LSTATUS RegSetValueExA(
HKEY hKey,
LPCSTR lpValueName, //相当于 key-value 里面的 key
DWORD Reserved, //保留值,必须强制为0
DWORD dwType, //被存储数据的类型,如果是字符串使用 REG_SZ
const BYTE *lpData, //要存储的数据
DWORD cbData //存储数据的长度
);
- 读取注册表中的数据
LSTATUS RegQueryValueExA(
HKEY hKey,
LPCSTR lpValueName,
LPDWORD lpReserved,
LPDWORD lpType,
LPBYTE lpData,
LPDWORD lpcbData
);
读取数据的时候要调用两遍这个函数
第一遍查询数据的长度,将 lpData 设置为 null,然后返回 lpcbData 就是数据的长度
第二遍查询数据,这个时候需要分配好空间,然后查询数据
- 关闭注册表
LSTATUS RegCloseKey(
HKEY hKey
);
- 注册表API用例
#include"iostream"
using namespace std;
#include <windows.h>
#include <vector>
const char* sub_key = "Software\\demo";
bool SetValue(const string& key, const string& value) {
HKEY hkey = NULL;
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;
}
shared_ptr<void> close_key(NULL, [&](void*) {
if (hkey != NULL) {
::RegCloseKey(hkey);
hkey = NULL;
}
});
res = ::RegSetValueExA(hkey, key.c_str(), 0, REG_SZ, (BYTE*)value.c_str(), value.length());
if (res != ERROR_SUCCESS) {
return false;
}
return true;
}
string GetValue(const string& key) {
HKEY hkey = NULL;
LSTATUS res = ::RegOpenKeyExA(HKEY_CURRENT_USER, sub_key, 0, KEY_READ, &hkey);
if (res != ERROR_SUCCESS) {
return "";
}
shared_ptr<void> close_key(NULL, [&](void*) {
if (hkey != NULL) {
::RegCloseKey(hkey);
hkey = NULL;
}
});
DWORD type = REG_SZ;
DWORD size = 0;
//第一次查询获取数据的长度
res = ::RegQueryValueExA(hkey, key.c_str(), 0, &type, NULL, &size);
if (res != ERROR_SUCCESS || size <= 0) {
return "";
}
vector<BYTE> value_data(size);
res = ::RegQueryValueExA(hkey, key.c_str(), 0, &type, value_data.data(), &size);
if (res != ERROR_SUCCESS) {
return "";
}
return string(value_data.begin(), value_data.end());
}
int main() {
const string key = "name";
const string value = "zmm";
bool ret = SetValue(key, value);
if (ret) {
cout << GetValue(key) << endl;
} else {
cout << "failed!" << endl;
}
return 0;
}
本文详细介绍了Windows注册表的基本概念和作用,包括如何使用API进行注册表项的创建、打开、读取和写入操作。通过示例代码展示了如何在C++中设置和获取注册表值。


被折叠的 条评论
为什么被折叠?



