IPlugin* load(const char* path) override { g_log_info.log("plugins") << "loading plugin " << path; typedef IPlugin* (*PluginCreator)(Engine&); Library* lib = Library::create(Path(path), m_engine.getAllocator()); if (lib->load()) { PluginCreator creator = (PluginCreator)lib->resolve("createPlugin"); if (creator) { IPlugin* plugin = creator(m_engine); if (!plugin->create()) { m_engine.getAllocator().deleteObject(plugin); ASSERT(false); return nullptr; } m_plugins.push(plugin); m_libraries.push(lib); g_log_info.log("plugins") << "plugin loaded"; return plugin; } } Library::destroy(lib); return 0; }
IPlugin* load(const char* path) override { g_log_info.log("plugins") << "loading plugin " << path; typedef IPlugin* (*PluginCreator)(Engine&); auto* lib = loadLibrary(path); if (lib) { PluginCreator creator = (PluginCreator)getLibrarySymbol(lib, "createPlugin"); if (creator) { IPlugin* plugin = creator(m_engine); if (!plugin || !plugin->create()) { LUMIX_DELETE(m_engine.getAllocator(), plugin); ASSERT(false); return nullptr; } m_plugins.push(plugin); m_libraries.push(lib); m_library_loaded.invoke(lib); g_log_info.log("plugins") << "plugin loaded"; return plugin; } } unloadLibrary(lib); return 0; }