#include #include #if defined(BASALT_OS_WINDOWS) #include #else #include #endif namespace Basalt::Presenter { enum class DllKind { RenderEngine, DataDeliver, ObjectLoader, AnimationLoader, }; 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(); public: template T* CreateInstance() { if (!m_Handle) return nullptr; using Fct = T* (*) (); constexpr char EXPOSE_FUNC_NAME[] = "BSCreateInstance"; #if defined(BASALT_OS_WINDOWS) auto fct = (Fct) GetProcAddress(m_Handle, EXPOSE_FUNC_NAME); #else auto fct = (Fct) dlsym(m_Handle, EXPOSE_FUNC_NAME); #endif return fct(); } private: Handle m_Handle; }; } // namespace Basalt::Presenter