14std::shared_ptr<char> get_last_error_msg() {
16 auto opt = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER |
17 FORMAT_MESSAGE_IGNORE_INSERTS;
18 auto lang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
19 if (FormatMessage(opt, NULL, GetLastError(), lang,
20 reinterpret_cast<char *
>(&err), 0, NULL) != 0) {
21 return std::shared_ptr<char>{err, [](
char *e) { LocalFree(e); }};
23 static char msg[] =
"(failed to get error message)";
24 return std::shared_ptr<char>{msg, [](
char *) {}};
28std::shared_ptr<void>
load_lib(
const std::filesystem::path &so_filename,
30 assert(!so_filename.empty());
31 void *h = LoadLibraryW(so_filename.c_str());
34 "\": " + get_last_error_msg().get());
35 return std::shared_ptr<void>{
36 h, +[](
void *h) { FreeLibrary(
static_cast<HMODULE
>(h)); }};
39void *
load_func(
void *handle,
const std::string &name) {
41 auto *h = GetProcAddress(
static_cast<HMODULE
>(handle), name.c_str());
44 "': " + get_last_error_msg().get());
45 return reinterpret_cast<void *
>(h);
48std::shared_ptr<void>
load_lib(
const std::filesystem::path &so_filename,
50 assert(!so_filename.empty());
52 void *h = ::dlopen(so_filename.c_str(), dl_flags);
53 if (
auto *err = ::dlerror())
55 return std::shared_ptr<void>{h, &::dlclose};
58void *
load_func(
void *handle,
const std::string &name) {
61 auto *h = ::dlsym(handle, name.c_str());
62 if (
auto *err = ::dlerror())
Dynamic library loading and symbol lookup.
void * load_func(void *lib_handle, const std::string &name)
Get a pointer to a function inside of a loaded DLL or SO file.
std::shared_ptr< void > load_lib(const std::filesystem::path &so_filename, DynamicLoadFlags flags)
Load a DLL or DSO file.
Flags to be passed to dlopen.
Failed to load a DLL or SO file, or failed to access a function in it.