可以执行任意导出参数的导出函数
#ifndef __DynamicLibrary_H
#define __DynamicLibrary_H
#include <windows.h>
#include <string>
#include <functional>
class DynamicLibraryT final
{
public:
DynamicLibraryT(const DynamicLibraryT& other) = delete;
DynamicLibraryT& operator=(const DynamicLibraryT& other) = delete;
DynamicLibraryT();
DynamicLibraryT(const std::string& path);
~DynamicLibraryT();
public:
bool LoadLibrary(const std::string& path);
bool FreeLibrary();
template<class r , class... ARGS_TYPES>
std::function<r(ARGS_TYPES...)> GetProcAddress(const std::string& funcName);
private:
HMODULE mod_;
std::string path_;
};
template<class r, class... ARGS_TYPES>
std::function<r(ARGS_TYPES...)> DynamicLibraryT::GetProcAddress(const std::string& funcName)
{
using func_imp = r(*)(ARGS_TYPES...);
std::function<r(ARGS_TYPES...)> f;
if (mod_)
{
func_imp f_ptr = (func_imp)::GetProcAddress(mod_, funcName.c_str());
if (f_ptr)
{
f = f_ptr;
}
}
return std::move(f);
}
#endif //__DynamicLibrary_H
#include "pch.h"
#include "DynamicLibraryT.h"
DynamicLibraryT::DynamicLibraryT() : DynamicLibraryT("")
{
}
DynamicLibraryT::DynamicLibraryT(const std::string& path) :
mod_(nullptr) ,
path_(path)
{
if (path_.size())
{
LoadLibrary(path_);
}
}
DynamicLibraryT::~DynamicLibraryT()
{
FreeLibrary();
}
bool DynamicLibraryT::LoadLibrary(const std::string& path)
{
if (mod_)
{
return true;
}
if (path.size())
{
path_ = path;
mod_ = ::LoadLibraryExA(path.c_str(), 0, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
}
return mod_ ? true : false;
}
bool DynamicLibraryT::FreeLibrary()
{
bool b = false;
if (mod_)
{
b = (bool)::FreeLibrary(mod_);
if (b)
{
mod_ = nullptr;
}
}
return b;
}