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;
// ...
};