#include #if defined(BASALT_OS_WINDOWS) #include #else #include #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 T* CreateInstance() { using Fct = T* (*) (); constexpr char EXPOSE_FUNC_NAME[] = "BSCreateInstance"; auto fct = (Fct) GetFunctionPointer(EXPOSE_FUNC_NAME); return fct(); } template 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::dll_loader