#include #include #if defined(BASALT_OS_WINDOWS) #include #else #include #endif namespace Basalt::Presenter { 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 std::basic_string_view 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