在Windows操作系统中,注册表是一个关键的数据存储,它包含了系统和应用程序的配置信息。然而,直接操作注册表可能会非常复杂和繁琐。为了简化这一过程,创建了一个名为RKEY的C++类,它可以方便地进行注册表的查询、设置和删除操作。
RKEY类提供了构造函数、赋值运算符和析构函数,支持从现有的HKEY或RKEY对象创建实例,也可以通过指定根键和子键来创建。此外,它还支持移动语义和复制构造函数。
以下是RKEY类的基本使用方法:
// 创建一个RKEY实例
RKEY r(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run");
// 查询值
string str = r[L"OneDrive"];
// str = "C:\\...\\OneDrive.exe" /background
DWORD some_dword = r[L"blahblah"];
// 内部调用RegQueryValueEx并复制值到DWORD
vector subs = r.EnumSubKeys();
vector allvalues = r.EnumValues();
RKEY::operator[]用于从RKEY获取VALUE,可以用于值的操纵。如果不确定值的类型,可以先使用EnumValues()枚举所有值,然后使用成员name, value, ty访问名称、类型和数据。
以下是设置或删除值的示例:
// 设置值
r[L"OneDrive"] = L"c:\\dos\\format.exe c: /u /norecovery /permanent /nowarnings /destroy /lowlevel";
// 删除单个子键
bool result = r.DeleteSingle(L"OneDrive");
// 删除整个子键
result = r.Delete();
RKEY类还提供了完整的代码实现,包括VALUE类的定义和RKEY类的各种成员函数。VALUE类用于存储注册表值的名称、数据和类型。RKEY类提供了Load、Open、Close和Valid等成员函数,用于加载、打开、关闭注册表键和检查键的有效性。
以下是RKEY类的完整代码:
class RKEY {
private:
HKEY k = 0;
public:
class VALUE {
public:
std::wstring name;
vector value;
HKEY k = 0;
mutable DWORD ty = 0;
VALUE(const wchar_t* s, HKEY kk) {
if (s) name = s;
k = kk;
}
// ... 省略部分代码 ...
};
RKEY() {
k = 0;
}
// ... 省略部分代码 ...
~RKEY() {
Close();
}
// ... 省略部分代码 ...
};