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