diff --git a/lib/libimhex/include/hex/plugin.hpp b/lib/libimhex/include/hex/plugin.hpp index fb7141b3a..7f35434b9 100644 --- a/lib/libimhex/include/hex/plugin.hpp +++ b/lib/libimhex/include/hex/plugin.hpp @@ -2,6 +2,7 @@ #include #include +#include #include @@ -24,46 +25,51 @@ #define IMHEX_PLUGIN_SETUP(name, author, description) IMHEX_PLUGIN_SETUP_IMPL(name, author, description) #define IMHEX_LIBRARY_SETUP() IMHEX_LIBRARY_SETUP_IMPL() -#define IMHEX_LIBRARY_SETUP_IMPL() \ - IMHEX_PLUGIN_VISIBILITY_PREFIX void initializeLibrary(); \ - extern "C" [[gnu::visibility("default")]] void WOLV_TOKEN_CONCAT(forceLinkPlugin_, IMHEX_PLUGIN_NAME)() { \ - hex::PluginManager::addPlugin(hex::PluginFunctions { \ - nullptr, \ - initializeLibrary, \ - nullptr, \ - nullptr, \ - nullptr, \ - nullptr, \ - nullptr, \ - nullptr, \ - nullptr \ - }); \ - } \ +#define IMHEX_LIBRARY_SETUP_IMPL() \ + IMHEX_PLUGIN_VISIBILITY_PREFIX void initializeLibrary(); \ + static auto WOLV_TOKEN_CONCAT(libraryInitializer_, IMHEX_PLUGIN_NAME) = [] { \ + initializeLibrary(); \ + hex::log::info("Library plugin '{}' initialized successfully", WOLV_STRINGIFY(IMHEX_PLUGIN_NAME)); \ + return 0; \ + }(); \ + extern "C" [[gnu::visibility("default")]] void WOLV_TOKEN_CONCAT(forceLinkPlugin_, IMHEX_PLUGIN_NAME)() { \ + hex::PluginManager::addPlugin(hex::PluginFunctions { \ + nullptr, \ + initializeLibrary, \ + nullptr, \ + nullptr, \ + nullptr, \ + nullptr, \ + nullptr, \ + nullptr, \ + nullptr \ + }); \ + } \ IMHEX_PLUGIN_VISIBILITY_PREFIX void initializeLibrary() -#define IMHEX_PLUGIN_SETUP_IMPL(name, author, description) \ - IMHEX_PLUGIN_VISIBILITY_PREFIX const char *getPluginName() { return name; } \ - IMHEX_PLUGIN_VISIBILITY_PREFIX const char *getPluginAuthor() { return author; } \ - IMHEX_PLUGIN_VISIBILITY_PREFIX const char *getPluginDescription() { return description; } \ - IMHEX_PLUGIN_VISIBILITY_PREFIX const char *getCompatibleVersion() { return IMHEX_VERSION; } \ - IMHEX_PLUGIN_VISIBILITY_PREFIX void setImGuiContext(ImGuiContext *ctx) { \ - ImGui::SetCurrentContext(ctx); \ - GImGui = ctx; \ - } \ - IMHEX_PLUGIN_VISIBILITY_PREFIX void initializePlugin(); \ - extern "C" [[gnu::visibility("default")]] void WOLV_TOKEN_CONCAT(forceLinkPlugin_, IMHEX_PLUGIN_NAME)() { \ - hex::PluginManager::addPlugin(hex::PluginFunctions { \ - initializePlugin, \ - nullptr, \ - getPluginName, \ - getPluginAuthor, \ - getPluginDescription, \ - getCompatibleVersion, \ - setImGuiContext, \ - nullptr, \ - nullptr \ - }); \ - } \ +#define IMHEX_PLUGIN_SETUP_IMPL(name, author, description) \ + IMHEX_PLUGIN_VISIBILITY_PREFIX const char *getPluginName() { return name; } \ + IMHEX_PLUGIN_VISIBILITY_PREFIX const char *getPluginAuthor() { return author; } \ + IMHEX_PLUGIN_VISIBILITY_PREFIX const char *getPluginDescription() { return description; } \ + IMHEX_PLUGIN_VISIBILITY_PREFIX const char *getCompatibleVersion() { return IMHEX_VERSION; } \ + IMHEX_PLUGIN_VISIBILITY_PREFIX void setImGuiContext(ImGuiContext *ctx) { \ + ImGui::SetCurrentContext(ctx); \ + GImGui = ctx; \ + } \ + IMHEX_PLUGIN_VISIBILITY_PREFIX void initializePlugin(); \ + extern "C" [[gnu::visibility("default")]] void WOLV_TOKEN_CONCAT(forceLinkPlugin_, IMHEX_PLUGIN_NAME)() { \ + hex::PluginManager::addPlugin(hex::PluginFunctions { \ + initializePlugin, \ + nullptr, \ + getPluginName, \ + getPluginAuthor, \ + getPluginDescription, \ + getCompatibleVersion, \ + setImGuiContext, \ + nullptr, \ + nullptr \ + }); \ + } \ IMHEX_PLUGIN_VISIBILITY_PREFIX void initializePlugin() /** diff --git a/lib/libimhex/source/api/plugin_manager.cpp b/lib/libimhex/source/api/plugin_manager.cpp index 80c263f0f..43409f166 100644 --- a/lib/libimhex/source/api/plugin_manager.cpp +++ b/lib/libimhex/source/api/plugin_manager.cpp @@ -17,6 +17,8 @@ namespace hex { Plugin::Plugin(const std::fs::path &path) : m_path(path) { + log::info("Loading plugin '{}'", wolv::util::toUTF8String(path.filename())); + #if defined(OS_WINDOWS) m_handle = uintptr_t(LoadLibraryW(path.c_str())); @@ -33,8 +35,6 @@ namespace hex { } #endif - log::info("Loaded plugin '{}'", wolv::util::toUTF8String(path.filename())); - m_functions.initializePluginFunction = getPluginFunction("initializePlugin"); m_functions.initializeLibraryFunction = getPluginFunction("initializeLibrary"); m_functions.getPluginNameFunction = getPluginFunction("getPluginName"); @@ -88,8 +88,6 @@ namespace hex { const auto pluginName = wolv::util::toUTF8String(m_path.filename()); if (this->isLibraryPlugin()) { - m_functions.initializeLibraryFunction(); - log::info("Library plugin '{}' initialized successfully", pluginName); return true; }