1
0
Files
BasaltMeter/BasaltPresenter/Presenter/dll_loader.hpp
2026-01-08 19:23:19 +08:00

54 lines
1.3 KiB
C++

#include <basalt/char_types.hpp>
#if defined(BASALT_OS_WINDOWS)
#include <Windows.h>
#else
#include <dlfcn.h>
#endif
namespace basalt::presenter::dll_loader {
enum class DllKind {
Engine, ///< Render engine
Deliver, ///< Data deliver
ObjectLoader, ///< 3D object loader
AnimeLoader, ///< Camera animation loader
};
class DllLoader {
public:
#if defined(BASALT_OS_WINDOWS)
using Handle = HMODULE;
#else
using Handle = void*;
#endif
public:
DllLoader(DllKind kind, const shared::char_types::BSStringView& filename);
~DllLoader();
private:
void* GetFunctionPointer(const char* name);
public:
template<typename T>
T* CreateInstance() {
using Fct = T* (*) ();
constexpr char EXPOSE_FUNC_NAME[] = "BSCreateInstance";
auto fct = (Fct) GetFunctionPointer(EXPOSE_FUNC_NAME);
return fct();
}
template<typename T>
void DestroyInstance(T* instance) {
using Fct = void (*) (T*);
constexpr char EXPOSE_FUNC_NAME[] = "BSDestroyInstance";
auto fct = (Fct) GetFunctionPointer(EXPOSE_FUNC_NAME);
fct(instance);
}
private:
Handle m_Handle;
};
} // namespace Basalt::Presenter