Listing 1
// Plugin.h #include "SharedLibrary.h" #include <memory> #include <string> #include <map> #ifdef _WIN32 #define DLLEXPORT _declspec(dllexport) #else #define DLLEXPORT #endif class DLLEXPORT Plugin { public: Plugin(const char* plugin_name, const char* plugin_type) : m_plugin_name(plugin_name), m_plugin_type(plugin_type) {} virtual const char* pluginName() const; virtual const char* pluginType() const; // ... }; typedef Plugin* (*plugin_init_func)(void); class DLLEXPORT PluginManager { public: static PluginManager& instance(); Plugin& findPlugin(const char* name) throw (SharedLibraryException); private: struct PluginInfo { SharedLibrary* m_library; std::string m_library_name; Plugin* m_plugin; ~PluginInfo() { delete m_plugin; delete m_library; } PluginInfo() : m_library(0), m_plugin(0) {} }; PluginManager() {} static PluginManager* ms_instance; std::map<std::string,PluginInfo* > m_plugin_map; // ... };