1#ifndef NEFORCE_PLUGIN_DYNAMIC_LIBRARY_HPP__
2#define NEFORCE_PLUGIN_DYNAMIC_LIBRARY_HPP__
11#include "NeForce/core/exception/system_exception.hpp"
12NEFORCE_BEGIN_NAMESPACE__
24struct dynamic_library_exception final : system_exception {
25 explicit dynamic_library_exception(
const char* info =
"Dynamic Library Operation Failed.",
27 system_exception(info, code) {}
29 explicit dynamic_library_exception(
const exception& e) :
30 system_exception(e) {}
32 ~dynamic_library_exception()
override =
default;
34 NEFORCE_NODISCARD
const char*
type() const noexcept
override {
return "dynamic_library_exception"; }
67 void* handle_{
nullptr};
69 load_mode load_mode_{load_mode::default_};
123 template <typename T>
125 return reinterpret_cast<T
>(
symbol(name));
134 NEFORCE_NODISCARD
void*
symbol(
const string& name)
const;
141 NEFORCE_NODISCARD
bool has_symbol(
const string& name)
const noexcept;
147 NEFORCE_NODISCARD
bool is_open() const noexcept {
return handle_ !=
nullptr; }
164 NEFORCE_NODISCARD
const string&
path() const noexcept {
return path_; }
212NEFORCE_END_NAMESPACE__
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
获取异常类型