CMCore/inc/hgl/plugin/PlugInManage.h

72 lines
2.5 KiB
C
Raw Normal View History

2019-08-23 17:11:24 +08:00
#ifndef HGL_PLUG_IN_MANAGE_INCLUDE
#define HGL_PLUG_IN_MANAGE_INCLUDE
#include<hgl/plugin/ExternalPlugIn.h>
#include<hgl/type/ObjectManage.h>
2019-08-26 21:19:13 +08:00
#include<hgl/type/StringList.h>
2019-08-23 17:11:24 +08:00
namespace hgl
{
/**
*
*/
class PlugInManage:public ObjectManage<OSString,PlugIn>
2019-08-23 17:11:24 +08:00
{
2019-08-27 20:26:44 +08:00
OSString name; ///<插件类目名称(必须符合代码名称规则)
2019-08-26 21:19:13 +08:00
2019-08-27 20:26:44 +08:00
OSStringList findpath; ///<插件查找目录
2019-08-23 17:11:24 +08:00
public:
2022-03-31 21:59:14 +08:00
PlugInManage(const OSString &n);
virtual ~PlugInManage()=default;
2019-08-26 21:19:13 +08:00
bool RegistryPlugin(PlugIn *); ///<注册一个内置插件
2019-08-27 20:26:44 +08:00
uint UnregistryPlugin(const OSString &); ///<释放一个内置插件
2019-08-26 21:19:13 +08:00
bool AddFindPath (const OSString &path); ///<添加一个插件查找目录
2019-08-27 20:26:44 +08:00
PlugIn *LoadPlugin (const OSString &,const OSString &); ///<加载一个外部插件,明确指定全路径文件名
PlugIn *LoadPlugin (const OSString &); ///<加载一个外部插件,自行查找
bool UnloadPlugin(const OSString &); ///<释放一个外部插件
};//class PlugInManage:public ObjectManage<UTF16String,PlugIn>
2019-08-23 17:11:24 +08:00
/**
*
*/
2019-08-26 21:19:13 +08:00
template<typename T> class RegistryPlugInProxy
2019-08-23 17:11:24 +08:00
{
2019-08-23 17:54:42 +08:00
T *plugin;
2019-08-23 17:11:24 +08:00
public:
RegistryPlugInProxy()
{
2019-08-26 21:19:13 +08:00
plugin=new T;
2019-08-23 17:11:24 +08:00
}
2019-08-23 17:54:42 +08:00
virtual ~RegistryPlugInProxy()
{
delete plugin;
}
2019-08-23 17:11:24 +08:00
2019-08-23 17:54:42 +08:00
T *get(){return plugin;}
2019-08-23 17:11:24 +08:00
};//template<typename T> class RegistryPlugInProxy
/*
2019-08-26 21:19:13 +08:00
Log插件中的Console,File插件
Log输出至MySQL的插件.dll/.so/dylib形式存在的
2019-08-23 17:11:24 +08:00
*/
#ifndef __MAKE_PLUGIN__ //内部插件
2019-08-23 17:54:42 +08:00
#define REGISTRY_PLUG_IN(name,classname) static RegistryPlugInProxy<name,classname> plugin_proxy_##classname; \
extern "C" void registry_plugin_##classname;
2019-08-23 17:11:24 +08:00
#else //外部插件
2019-08-23 17:54:42 +08:00
#define REGISTRY_PLUG_IN(name,classname) static RegistryPlugInProxy<name,classname> plugin_proxy_##classname \
2019-08-23 17:11:24 +08:00
extern "C" void registry_plugin_##name(void)
{
}
#endif//__MAKE_PLUGIN__
}//namespace hgl
#endif//HGL_PLUG_IN_MANAGE_INCLUDE