65.9K
CodeProject 正在变化。 阅读更多。
Home

(另一个)C++注册表包装器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.17/5 (18投票s)

2005 年 6 月 20 日

CPOL

3分钟阅读

viewsIcon

79430

downloadIcon

1957

用于注册表操作的单头文件封装器。

引言

是的,我知道。又一个 Windows 注册表封装器?抱歉,但是在和 Google 先生聊天后,我需要一些比我能找到的更好的东西。如果您认为我错过了什么,请告诉我。

注册表有点像文件系统,其中包含有限数量的文件类型。我使用Hive来表示顶级根目录,例如HKEY_CURRENT_USERKey表示分层路径或文件夹,例如SOFTWARE\Microsoft\Office,以及Value表示位于 Key 中的项目,例如DWORD或字符串。 值具有Name,它们对应于文件系统类比中的文件名。值是文件的内容。

我不喜欢设计封装器的厨房水槽方法。注册表键类实现 operator HKEY() constoperator HKEY&(),因此您仍然可以轻松使用标准 API 函数。注册表值类直接映射到库存类型。 如果你想存储更复杂的东西,编写一个填充二进制值类型的封装器。API 紧贴标准 C API,因此如果您已经知道如何使用注册表,您会感到宾至如归。例如,我的 RegKey::QueryValue 只是隐藏了常用的 RegQueryValueEx 数据大小协商,并且具有相同的返回值。

使用代码

RegValue 是一个变体,可以包含任何允许的注册表值:REG_BINARYREG_DWORDREG_QWORDREG_SZREG_EXPAND_SZREG_MULTI_SZREG_NONERegValue 是一个行为良好的抽象数据类型,可以安全地在 STL 容器中使用。 类型由您用来构造 RegValue 的内容决定。 如果需要,您也可以直接操作类型和数据。 支持来自 C++ 类型的运算符赋值,并且应该像您期望的那样工作。 通过 operator< 提供严格的弱排序。

RegKey 提供了各种系统注册表函数的封装器。 它也是一个行为良好的抽象数据类型,但没有使用智能指针等进行优化,以避免打开或创建键的昂贵操作。 构造函数采用顶级 hive 和一个可选的机器名称用于远程键。 方法 OpenCreate 调用 RegOpenKeyExRegCreateKeyEx,并提供覆盖默认 SAM KEY_ALL_ACCESS 的选项。 此类不公开 SID。

获取和设置值的首选方法是使用 operator[]。 这隐藏了 RegQueryValueExRegSetValueEx 的机制。 例如

RegKey key(HKEY_CURRENT_USER);
key.Open("Console");
RegValue value = key["CursorSize"];
if (value < RegValue(20))
    key["CursorSize"] = (DWORD)25;

如果 CursorSize 是小于 20 的 DWORD,则将键 HKCU\ConsoleCursorSize 更改为 25。

为枚举键的子键和枚举键中的所有值提供了前向迭代器。

copy(RegKeyForwardIterator(key), RegKeyForwardIterator(), 
           ostream_iterator<TCHAR*>(cout, " "));

将打印 key 的所有子键的空格分隔列表。 值的迭代器返回一个 pair<LPCTSTR,RegValue>,其中包含键中的名称和值对。

RegValueForwardIterator i(key), e;
for (; i != e; ++i) {
    LPCTSTR name = (*i).first;
    RegValue value = (*i).second;
    if (value.Type == REG_SZ)
        cout << name << ": " << value.operator LPCTSTR() << endl;
}

打印出 key 中所有字符串类型的名称和值。

这些迭代器都不允许修改注册表项。

关注点

用于处理 RegValue 左值的代理类有点弱。 我应该提供更完整的 RegValue 成员覆盖。

历史

  • 2005 年 6 月 20 日 - 初始版本。
© . All rights reserved.