33 static constexpr size_t kMaxFunctionsNotFound = 10;
37 library_handle_(
nullptr)
43 if (library_handle_ ==
nullptr)
49 FreeLibrary(
static_cast<HINSTANCE
>(library_handle_));
50#elif defined(__GNUC__)
51 dlclose(library_handle_);
55 bool TryToLoad(
const std::string& library_name)
57 library_name_ = std::string(library_name);
59 library_handle_ =
static_cast<void*
>(LoadLibraryA(library_name.c_str()));
60#elif defined(__GNUC__)
61 library_handle_ = dlopen(library_name.c_str(), RTLD_NOW);
63 return library_handle_ !=
nullptr;
66 bool LibraryIsLoaded()
const
68 return library_handle_ !=
nullptr;
71 const std::vector<std::string>& FunctionsNotFound()
const
73 return functions_not_found_;
77 std::function<T> GetFunction(
const char* function_name)
79 const void* function_address =
82 GetProcAddress(
static_cast<HINSTANCE
>(library_handle_), function_name));
84 dlsym(library_handle_, function_name);
88 if (!function_address && functions_not_found_.size() < kMaxFunctionsNotFound)
90 functions_not_found_.push_back(function_name);
93 return TypeParser<T>::CreateFunction(function_address);
97 std::function<T> GetFunction(
const std::string& function_name)
99 return GetFunction<T>(function_name.c_str());
103 void GetFunction(std::function<T>* function,
const char* function_name)
105 *function = GetFunction<T>(function_name);
109 void GetFunction(std::function<T>* function,
const std::string function_name)
111 GetFunction<T>(function, function_name.c_str());
115 void* library_handle_ =
nullptr;
116 std::string library_name_;
117 std::vector<std::string> functions_not_found_;
124 template<
typename Ret,
typename... Args>
125 struct TypeParser<Ret(Args...)>
127 static std::function<Ret(Args...)> CreateFunction(
const void* function_address)
129 return std::function<Ret(Args...)>(
130 reinterpret_cast<Ret (*)(Args...)
>(
const_cast<void*
>(function_address)));