NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
dynamic_library.hpp
浏览该文件的文档.
1#ifndef NEFORCE_PLUGIN_DYNAMIC_LIBRARY_HPP__
2#define NEFORCE_PLUGIN_DYNAMIC_LIBRARY_HPP__
3
10
11#include "NeForce/core/exception/system_exception.hpp"
12NEFORCE_BEGIN_NAMESPACE__
13
19
24struct dynamic_library_exception final : system_exception {
25 explicit dynamic_library_exception(const char* info = "Dynamic Library Operation Failed.",
26 const error_code code = last_error()) noexcept :
27 system_exception(info, code) {}
28
29 explicit dynamic_library_exception(const exception& e) :
30 system_exception(e) {}
31
32 ~dynamic_library_exception() override = default;
33
34 NEFORCE_NODISCARD const char* type() const noexcept override { return "dynamic_library_exception"; }
35};
36 // Exceptions
38
44
51class NEFORCE_API dynamic_library {
52public:
57 enum class load_mode : int {
58 default_ = 0,
59 lazy = 1 << 0,
60 now = 1 << 1,
61 global = 1 << 2,
62 local = 1 << 3,
63 deep_bind = 1 << 4
64 };
65
66private:
67 void* handle_{nullptr};
68 string path_;
69 load_mode load_mode_{load_mode::default_};
70
71private:
72 void open();
73 void close();
74
75public:
81 dynamic_library() noexcept = default;
82
88 explicit dynamic_library(string pth);
89
96 dynamic_library(string pth, load_mode mode);
97
99
100 dynamic_library(const dynamic_library&) = delete;
101 dynamic_library& operator=(const dynamic_library&) = delete;
102
108
114 dynamic_library& operator=(dynamic_library&& other) noexcept;
115
123 template <typename T>
124 T to_symbol(const string& name) const {
125 return reinterpret_cast<T>(symbol(name));
126 }
127
134 NEFORCE_NODISCARD void* symbol(const string& name) const;
135
141 NEFORCE_NODISCARD bool has_symbol(const string& name) const noexcept;
142
147 NEFORCE_NODISCARD bool is_open() const noexcept { return handle_ != nullptr; }
148
152 void unload() { close(); }
153
158 NEFORCE_NODISCARD void* native_handle() const noexcept { return handle_; }
159
164 NEFORCE_NODISCARD const string& path() const noexcept { return path_; }
165
170 NEFORCE_NODISCARD load_mode get_load_mode() const noexcept { return load_mode_; }
171
178
186 static dynamic_library load_by_name(const string& name, load_mode mode = load_mode::default_);
187
194 NEFORCE_NODISCARD vector<string> list_symbols(const string& name_filter = "") const;
195
200 NEFORCE_NODISCARD static string program_location();
201
207 NEFORCE_NODISCARD static string symbol_location(void* symbol_ptr);
208};
209 // DynamicLibrary
211
212NEFORCE_END_NAMESPACE__
213#endif // NEFORCE_PLUGIN_DYNAMIC_LIBRARY_HPP__
bool has_symbol(const string &name) const noexcept
检查符号是否存在
static dynamic_library load_by_name(const string &name, load_mode mode=load_mode::default_)
按名称加载动态库
static string symbol_location(void *symbol_ptr)
获取指定符号所在的动态库路径
vector< string > list_symbols(const string &name_filter="") const
列出动态库中的符号
void * symbol(const string &name) const
获取原始符号地址
T to_symbol(const string &name) const
获取符号
dynamic_library() noexcept=default
默认构造函数
const string & path() const noexcept
获取库文件路径
static string program_location()
获取当前程序的可执行文件路径
void * native_handle() const noexcept
获取原生句柄
load_mode get_load_mode() const noexcept
获取当前加载模式
static dynamic_library load_self()
加载自身(当前进程可执行文件)
bool is_open() const noexcept
检查动态库是否已加载
动态大小数组容器
error_code last_error() noexcept
获取当前系统错误码
const char * type() const noexcept override
获取异常类型