增加插件定义

This commit is contained in:
hyzboy 2019-08-23 17:11:24 +08:00
parent 3ecd4faa12
commit c5dca40260
6 changed files with 258 additions and 5 deletions

View File

@ -0,0 +1,43 @@
#ifndef HGL_EXTERNAL_PLUG_IN_INCLUDE
#define HGL_EXTERNAL_PLUG_IN_INCLUDE
#include<hgl/plugin/PlugIn.h>
#include<hgl/platform/ExternalModule.h>
namespace hgl
{
/**
*
*/
enum class PlugInStatus
{
NONE, ///<无此插件
LOAD_FAILED, ///<加载失败
NO_LOAD, ///<可用未加载
COMPLETE, ///<成功加载可用
};//enum class PlugInStatus
/**
*
*/
class ExternalPlugIn:public PlugIn
{
PlugInStatus status;
OSString filename; ///<插件对应的真实文件系统名称
ExternalModule *pi_module;
public:
PlugInStatus GetStatus()const{return status;}
public:
ExternalPlugIn();
virtual ~ExternalPlugIn();
void Free(); ///<释放插件文件
bool Load(const UTF16String &,const OSString &); ///<加载插件
};//class ExternalPlugIn:public PlugIn
}//namespace hgl
#endif//HGL_EXTERNAL_PLUG_IN_INCLUDE

46
inc/hgl/plugin/PlugIn.h Normal file
View File

@ -0,0 +1,46 @@
#ifndef HGL_PLUGIN_INCLUDE
#define HGL_PLUGIN_INCLUDE
#include<hgl/type/BaseString.h>
#include<hgl/plugin/PlugInInterface.h>
namespace hgl
{
/**
*
*/
class PlugIn ///插件
{
protected:
uint ref_count;
uint ver;
UTF16String name;
UTF16String intro;
OSString filename; ///<插件文件名
PlugInInterface *plugin_interface;
public:
const uint GetVersion ()const{return ver;} ///<取得插件版本
const UTF16String & GetIntro ()const{return intro;} ///<取得插件介绍
const UTF16String & GetName ()const{return name;} ///<取得插件名称
public:
PlugIn()
{
ref_count=0;
ver=0;
plugin_interface=nullptr;
}
virtual ~PlugIn();
uint add_ref(){return ++ref_count;}
uint release_ref(){return --ref_count;}
};//class PlugIn
}//namespace hgl
#endif//HGL_PLUGIN_INCLUDE

View File

@ -0,0 +1,34 @@
#ifndef HGL_PLUG_IN_INTERFACE_INCLUDE
#define HGL_PLUG_IN_INTERFACE_INCLUDE
#include<hgl/type/DataType.h>
namespace hgl
{
typedef void (*ClosePlugInPROC)(); ///<关闭插件
typedef uint32 (*GetPlugInVersionPROC)(); ///<取得插件版本号
typedef u16char * (*GetPlugInIntroPROC)(); ///<取得插件介绍信息
typedef bool (*GetPlugInInterfacePROC)(uint32,void *); ///<取得插件接口
typedef void (*SetPlugInInterfacePROC)(void *,void *); ///<设置插件接口
typedef bool (*LoadInterfaceByNamePROC)(const u16char *,uint32,void *); ///<取得接口
typedef bool (*LoadInterfaceByIndexPROC)(uint32,uint32,void *); ///<取得接口
struct PlugInInterface
{
ClosePlugInPROC Close;
GetPlugInVersionPROC GetVersion;
GetPlugInIntroPROC GetIntro;
GetPlugInInterfacePROC GetInterface;
SetPlugInInterfacePROC SetInterface;
LoadInterfaceByNamePROC LoadByName;
LoadInterfaceByIndexPROC LoadByIndex;
};//struct PlugInInterface
typedef PlugInInterface *(*InitPlugInPROC)(); ///<初始化插件
}//namespace hgl
#endif//HGL_PLUG_IN_INTERFACE_INCLUDE

View File

@ -0,0 +1,65 @@
#ifndef HGL_PLUG_IN_MANAGE_INCLUDE
#define HGL_PLUG_IN_MANAGE_INCLUDE
#include<hgl/plugin/ExternalPlugIn.h>
#include<hgl/type/ResManage.h>
namespace hgl
{
/**
*
*/
template<typename T,typename C> class PlugInManage:public ResManage<C,PlugIn>
{
OSString name; ///<插件类目名称(必须符合代码名称规则)
public:
PlugInManage(const OSString &n)
{
name=n;
}
virtual ~PlugInManager()=default;
};//template<typename T> class PlugInManage
/**
*
*/
template<typename T> class RegistryPlugInProxy
{
SharedPtr<T> plugin;
public:
RegistryPlugInProxy()
{
plugin=new T;
}
virtual ~RegistryPlugInProxy()=default;
T *get(){return *plugin;}
};//template<typename T> class RegistryPlugInProxy
/*
:
Log一类必须存在的插件
:
.dll/.so/.dylib文件形式存在
log console/log file外
*/
#ifndef __MAKE_PLUGIN__ //内部插件
#define REGISTRY_PLUG_IN(name,classname) static RegistryPlugInProxy<classname> plugin_proxy_##classname;
#else //外部插件
#define REGISTRY_PLUG_IN(name,classname)
static
extern "C" void registry_plugin_##name(void)
{
}
#endif//__MAKE_PLUGIN__
}//namespace hgl
#endif//HGL_PLUG_IN_MANAGE_INCLUDE

View File

@ -43,12 +43,11 @@ SET(BASE_OTHER_SOURCE
SOURCE_GROUP("Other" FILES ${BASE_OTHER_SOURCE}) SOURCE_GROUP("Other" FILES ${BASE_OTHER_SOURCE})
SET(BASE_PLUG_IN_SOURCE file(GLOB BASE_PLUG_IN_HEADER ${CMCORE_ROOT_INCLUDE_PATH}/hgl/plugin/*.h)
PlugIn/ExternalModule.cpp file(GLOB BASE_PLUG_IN_SOURCE PlugIn/*.cpp)
# PlugIn/PlugIn.cpp
)
SOURCE_GROUP("PlugIn" FILES ${BASE_PLUG_IN_SOURCE}) SOURCE_GROUP("PlugIn\\Header Files" FILES ${BASE_PLUG_IN_HEADER})
SOURCE_GROUP("PlugIn\\Source Files" FILES ${BASE_PLUG_IN_SOURCE})
add_library(CMCore STATIC #${SYSTEM_INFO_SOURCE} add_library(CMCore STATIC #${SYSTEM_INFO_SOURCE}
${TYPE_TEMPLATE_HEADER} ${TYPE_TEMPLATE_HEADER}
@ -56,6 +55,8 @@ add_library(CMCore STATIC #${SYSTEM_INFO_SOURCE}
${BASE_IO_SOURCE} ${BASE_IO_SOURCE}
${BASE_FILE_SYSTEM_SOURCE} ${BASE_FILE_SYSTEM_SOURCE}
${BASE_OTHER_SOURCE} ${BASE_OTHER_SOURCE}
${BASE_PLUG_IN_HEADER}
${BASE_PLUG_IN_SOURCE}) ${BASE_PLUG_IN_SOURCE})
set_property(TARGET CMCore PROPERTY FOLDER "CM") set_property(TARGET CMCore PROPERTY FOLDER "CM")

View File

@ -0,0 +1,64 @@
#include<hgl/plugin/ExternalPlugIn.h>
#include<hgl/plugin/PlugInInterface.h>
namespace hgl
{
ExternalPlugIn::ExternalPlugIn()
{
status=PlugInStatus::NONE;
pi_module=nullptr;
}
ExternalPlugIn::~ExternalPlugIn()
{
this->Free();
}
void ExternalPlugIn::Free()
{
if(!pi_module)return;
plugin_interface->Close();
delete pi_module;
pi_module=nullptr;
status=PlugInStatus::NO_LOAD;
}
bool ExternalPlugIn::Load(const UTF16String &pn,const OSString &fn)
{
if(pi_module)
return(true);
if(status==PlugInStatus::LOAD_FAILED) //过去是加载失败
return(false); //直接拒绝加载
pi_module=LoadExternalModule(fn.c_str());
if(pi_module)
{
InitPlugInPROC init_proc=(InitPlugInPROC)pi_module->GetFunc("InitPlugIn");
if(init_proc!=nullptr)
{
plugin_interface=init_proc();
if(plugin_interface)
{
status=PlugInStatus::COMPLETE;
name =pn;
filename=fn;
ver =plugin_interface->GetVersion();
intro =plugin_interface->GetIntro();
return(true);
}
}
}
status=PlugInStatus::LOAD_FAILED;
return(false);
}
}//namespace hgl