NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
registry_key.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_SYSTEM_REGISTRY_KEY_HPP__
2#define NEFORCE_CORE_SYSTEM_REGISTRY_KEY_HPP__
3
11
13#ifdef NEFORCE_PLATFORM_WINDOWS
14# include "NeForce/core/exception/system_exception.hpp"
15# include <windef.h>
16# include <winreg.h>
17NEFORCE_BEGIN_NAMESPACE__
18
24
29struct registry_key_exception final : system_exception {
30 explicit registry_key_exception(const char* info = "Registry Key Operation Failed.",
31 const error_code code = last_error()) noexcept :
32 system_exception(info, code) {}
33
34 explicit registry_key_exception(const exception& e) :
35 system_exception(e) {}
36
37 ~registry_key_exception() override = default;
38
39 NEFORCE_NODISCARD const char* type() const noexcept override { return "registry_key_exception"; }
40};
41 // Exceptions
43
49
56class NEFORCE_API registry_key {
57public:
62 struct root_key {
67 static ::HKEY classes_root() noexcept { return HKEY_CLASSES_ROOT; }
68
73 static ::HKEY current_user() noexcept { return HKEY_CURRENT_USER; }
74
79 static ::HKEY local_machine() noexcept { return HKEY_LOCAL_MACHINE; }
80
85 static ::HKEY users() noexcept { return HKEY_USERS; }
86
91 static ::HKEY current_config() noexcept { return HKEY_CURRENT_CONFIG; }
92 };
93
100 enum class value_type : ::DWORD {
101 none = REG_NONE,
102 string = REG_SZ,
103 expand_string = REG_EXPAND_SZ,
104 binary = REG_BINARY,
105 dword = REG_DWORD,
106 qword = REG_QWORD,
107 multi_string = REG_MULTI_SZ
108 };
109
114 enum wow64_view : ::REGSAM {
116 view_32bit = KEY_WOW64_32KEY,
117 view_64bit = KEY_WOW64_64KEY,
118 };
119
124 struct NEFORCE_API value_info {
128
134 NEFORCE_NODISCARD wstring to_string() const;
135
140 NEFORCE_NODISCARD ::DWORD to_dword() const noexcept;
141
146 NEFORCE_NODISCARD ::ULONGLONG to_qword() const noexcept;
147
153 NEFORCE_NODISCARD vector<wstring> to_multi_string() const;
154 };
155
156private:
157 ::HKEY hkey_ = nullptr;
158 bool owns_handle_ = false;
159
160 void close() noexcept;
161 void throw_if_invalid() const;
162 NEFORCE_NODISCARD value_info get_value_info(const wstring& name) const;
163
164public:
170 registry_key() = default;
171
178 explicit registry_key(::HKEY key);
179
186
187 registry_key(const registry_key&) = delete;
188 registry_key& operator=(const registry_key&) = delete;
189
194 registry_key(registry_key&& other) noexcept;
195
201 registry_key& operator=(registry_key&& other) noexcept;
202
207 NEFORCE_NODISCARD bool is_valid() const noexcept { return hkey_ != nullptr; }
208
213 explicit operator bool() const noexcept { return is_valid(); }
214
222 void create_sub_key(const wstring& name);
223
233 void open(::HKEY root, const wstring& path, ::REGSAM sam_desired = KEY_READ | KEY_WRITE);
234
242 NEFORCE_NODISCARD registry_key open_sub_key(const wstring& name, REGSAM sam_desired = KEY_READ) const;
243
251 void delete_sub_key(const wstring& name);
252
258 void delete_value(const wstring& name);
259
267 static void delete_key_tree(::HKEY root, const wstring& path);
268
274 NEFORCE_NODISCARD bool has_sub_key(const wstring& name) const;
275
281 NEFORCE_NODISCARD bool has_value(const wstring& name) const;
282
288 NEFORCE_NODISCARD vector<wstring> enum_sub_key_names() const;
289
295 NEFORCE_NODISCARD vector<value_info> enum_values() const;
296
303 void set_string_value(const wstring& name, const wstring& value);
304
311 void set_expand_string_value(const wstring& name, const wstring& value);
312
319 void set_dword_value(const wstring& name, ::DWORD value);
320
327 void set_qword_value(const wstring& name, ::ULONGLONG value);
328
336 void set_binary_value(const wstring& name, const ::BYTE* data, ::DWORD size);
337
346 void set_multi_string_value(const wstring& name, const vector<wstring>& values);
347
355 NEFORCE_NODISCARD wstring get_string_value(const wstring& name, const wstring& default_val = L"") const;
356
363 NEFORCE_NODISCARD ::DWORD get_dword_value(const wstring& name, DWORD default_val = 0) const noexcept;
364
371 NEFORCE_NODISCARD ::ULONGLONG get_qword_value(const wstring& name, ULONGLONG default_val = 0) const noexcept;
372
379 NEFORCE_NODISCARD vector<byte_t> get_binary_value(const wstring& name) const;
380
387 NEFORCE_NODISCARD vector<wstring> get_multi_string_value(const wstring& name) const;
388
393 NEFORCE_NODISCARD ::HKEY native_handle() const noexcept { return hkey_; }
394
403 void open(::HKEY root, const wstring& path, wow64_view view, ::REGSAM sam_desired = KEY_READ | KEY_WRITE);
404
412 bool notify_change(bool watch_subtree = true, int timeout_ms = -1);
413};
414 // Registry
416
417NEFORCE_END_NAMESPACE__
418#endif
419#endif // NEFORCE_CORE_SYSTEM_REGISTRY_KEY_HPP__
文件路径类
registry_key open_sub_key(const wstring &name, REGSAM sam_desired=KEY_READ) const
打开子项
void open(::HKEY root, const wstring &path, ::REGSAM sam_desired=KEY_READ|KEY_WRITE)
打开注册表项
void create_sub_key(const wstring &name)
创建子项
bool has_value(const wstring &name) const
检查是否存在指定的值
void set_multi_string_value(const wstring &name, const vector< wstring > &values)
设置多字符串值
bool is_valid() const noexcept
检查注册表项是否有效
vector< value_info > enum_values() const
枚举所有值
void set_expand_string_value(const wstring &name, const wstring &value)
设置可扩展字符串值
void set_string_value(const wstring &name, const wstring &value)
设置字符串值
bool notify_change(bool watch_subtree=true, int timeout_ms=-1)
监听注册表项变更(阻塞直到变更或超时)
vector< wstring > enum_sub_key_names() const
枚举所有子项名称
wstring get_string_value(const wstring &name, const wstring &default_val=L"") const
获取字符串值
vector< wstring > get_multi_string_value(const wstring &name) const
获取多字符串值
void set_qword_value(const wstring &name, ::ULONGLONG value)
设置64位整数值
vector< byte_t > get_binary_value(const wstring &name) const
获取二进制值
::DWORD get_dword_value(const wstring &name, DWORD default_val=0) const noexcept
获取32位整数值
bool has_sub_key(const wstring &name) const
检查是否存在指定的子项
wow64_view
注册表 32/64 位视图控制
void delete_value(const wstring &name)
删除值
::HKEY native_handle() const noexcept
获取原生注册表句柄
void open(::HKEY root, const wstring &path, wow64_view view, ::REGSAM sam_desired=KEY_READ|KEY_WRITE)
打开注册表项
void set_dword_value(const wstring &name, ::DWORD value)
设置32位整数值
registry_key()=default
默认构造函数
void delete_sub_key(const wstring &name)
删除子项
value_type
系统注册表值类型枚举
::ULONGLONG get_qword_value(const wstring &name, ULONGLONG default_val=0) const noexcept
获取64位整数值
static void delete_key_tree(::HKEY root, const wstring &path)
递归删除注册表项树
void set_binary_value(const wstring &name, const ::BYTE *data, ::DWORD size)
设置二进制值
动态大小数组容器
unsigned char byte_t
字节类型,定义为无符号字符
error_code last_error() noexcept
获取当前系统错误码
constexpr none_t none
默认空表示
basic_string< wchar_t > wstring
宽字符字符串
constexpr decltype(auto) size(const Container &cont) noexcept(noexcept(cont.size()))
获取容器的大小
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
系统注册表根键常量
::HKEY users() noexcept
HKEY_USERS根键
::HKEY classes_root() noexcept
HKEY_CLASSES_ROOT根键
::HKEY current_user() noexcept
HKEY_CURRENT_USER根键
::HKEY local_machine() noexcept
HKEY_LOCAL_MACHINE根键
::HKEY current_config() noexcept
HKEY_CURRENT_CONFIG根键
系统注册表值信息结构
::ULONGLONG to_qword() const noexcept
将值数据转换为64位整数
::DWORD to_dword() const noexcept
将值数据转换为32位整数
wstring to_string() const
将值数据转换为字符串
vector< byte_t > data
原始数据
vector< wstring > to_multi_string() const
将值数据转换为多字符串列表
const char * type() const noexcept override
获取异常类型
WindowsAPI 平台宏