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






4.17/5 (18投票s)
用于注册表操作的单头文件封装器。
引言
是的,我知道。又一个 Windows 注册表封装器?抱歉,但是在和 Google 先生聊天后,我需要一些比我能找到的更好的东西。如果您认为我错过了什么,请告诉我。
注册表有点像文件系统,其中包含有限数量的文件类型。我使用Hive来表示顶级根目录,例如HKEY_CURRENT_USER,Key表示分层路径或文件夹,例如SOFTWARE\Microsoft\Office,以及Value表示位于 Key 中的项目,例如DWORD
或字符串。 值具有Name,它们对应于文件系统类比中的文件名。值是文件的内容。
我不喜欢设计封装器的厨房水槽方法。注册表键类实现 operator HKEY() const
和 operator HKEY&()
,因此您仍然可以轻松使用标准 API 函数。注册表值类直接映射到库存类型。 如果你想存储更复杂的东西,编写一个填充二进制值类型的封装器。API 紧贴标准 C API,因此如果您已经知道如何使用注册表,您会感到宾至如归。例如,我的 RegKey::QueryValue
只是隐藏了常用的 RegQueryValueEx
数据大小协商,并且具有相同的返回值。
使用代码
类 RegValue
是一个变体,可以包含任何允许的注册表值:REG_BINARY
、REG_DWORD
、REG_QWORD
、REG_SZ
、REG_EXPAND_SZ
、REG_MULTI_SZ
或 REG_NONE
。RegValue
是一个行为良好的抽象数据类型,可以安全地在 STL 容器中使用。 类型由您用来构造 RegValue
的内容决定。 如果需要,您也可以直接操作类型和数据。 支持来自 C++ 类型的运算符赋值,并且应该像您期望的那样工作。 通过 operator<
提供严格的弱排序。
RegKey
提供了各种系统注册表函数的封装器。 它也是一个行为良好的抽象数据类型,但没有使用智能指针等进行优化,以避免打开或创建键的昂贵操作。 构造函数采用顶级 hive 和一个可选的机器名称用于远程键。 方法 Open
和 Create
调用 RegOpenKeyEx
和 RegCreateKeyEx
,并提供覆盖默认 SAM KEY_ALL_ACCESS
的选项。 此类不公开 SID。
获取和设置值的首选方法是使用 operator[]
。 这隐藏了 RegQueryValueEx
和 RegSetValueEx
的机制。 例如
RegKey key(HKEY_CURRENT_USER); key.Open("Console"); RegValue value = key["CursorSize"]; if (value < RegValue(20)) key["CursorSize"] = (DWORD)25;
如果 CursorSize
是小于 20 的 DWORD
,则将键 HKCU\Console 值 CursorSize
更改为 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 日 - 初始版本。