1
0
Files
BasaltMeter/BasaltPresenter/Presenter/dll_loader.hpp

55 lines
1.3 KiB
C++
Raw Normal View History

2026-01-06 16:27:19 +08:00
#include <basalt/char_types.hpp>
2025-11-27 14:15:20 +08:00
#include <string_view>
#if defined(BASALT_OS_WINDOWS)
#include <Windows.h>
#else
#include <dlfcn.h>
#endif
namespace Basalt::Presenter {
enum class DllKind {
2026-01-04 16:12:36 +08:00
Engine, ///< Render engine
Deliver, ///< Data deliver
ObjectLoader, ///< 3D object loader
AnimeLoader, ///< Camera animation loader
2025-11-27 14:15:20 +08:00
};
class DllLoader {
public:
#if defined(BASALT_OS_WINDOWS)
using Handle = HMODULE;
#else
2025-11-27 20:48:35 +08:00
using Handle = void*;
2025-11-27 14:15:20 +08:00
#endif
public:
2026-01-05 16:51:58 +08:00
DllLoader(DllKind kind, const Shared::Char::BSStringView& filename);
2025-11-27 14:15:20 +08:00
~DllLoader();
2025-11-27 21:52:40 +08:00
private:
void* GetFunctionPointer(const char* name);
2025-11-27 20:48:35 +08:00
public:
template<typename T>
T* CreateInstance() {
using Fct = T* (*) ();
constexpr char EXPOSE_FUNC_NAME[] = "BSCreateInstance";
2025-11-27 21:52:40 +08:00
auto fct = (Fct) GetFunctionPointer(EXPOSE_FUNC_NAME);
2025-11-27 20:48:35 +08:00
return fct();
}
2026-01-04 23:11:58 +08:00
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);
}
2025-11-27 20:48:35 +08:00
2025-11-27 14:15:20 +08:00
private:
Handle m_Handle;
};
} // namespace Basalt::Presenter