构建自己的C/C++插件开发框架(四)——核心层设计和实现
发布日期:2021-10-03 22:59:39 浏览次数:10 分类:技术文章

本文共 2364 字,大约阅读时间需要 7 分钟。

上面一篇文章大致描述了一下插件开发框架整体结构。这篇描述一下核心层的设计和实现。

至于核心层的设计,我想借鉴 一下微内核的思想。核心层只负责实现下面几个功能:

1、  插件的加载,检测,初始化。

2、  服务的注册。

3、  服务的调用。

4、  服务的管理。


插件的加载,检测,初始化

插件的加载利用linux共享库的动态加载技术。具体的方法可以看一下IBM网站的一篇资料 。

 

服务的注册

服务的注册与调用采用表驱动的方法。核心层中维护一个服务注册表。

//插件间交互消息类型
typedef enum __Service_Type
{
    Service_Max,

}Service_Type;


//插件用于和其他插件通信接口函数,由插件提供。
typedef PRsp_Ele_Stream (*PF_Invoke_Service_Func)(PReq_Ele_Stream pele_str);


//驱动表
typedef PF_Invoke_Service_Func Service_Drive_Table[Service_Max];

驱动表是一个数组,下标为插件间交互消息类型,成员为插件提供的接收的消息处理函数,由插件初始化的时候,调用插件框架的的注册函数注册到驱动表。

插件的初始化实现为:
//插件用于注册处理的消息类型的函数,由插件框架提供。
typedef RET_RESULT (*PF_Service_Register_Func)(Service_Type service_type);

//插件用于和其他插件通信接口函数,由插件框架提供。
typedef PRsp_Ele_Stream (*PF_Invoke_Service_Func)(PReq_Ele_Stream pele_str);

//插件回复响应函数。插件收到异步请求后,处理完成后,发送响应消息给请求的插件。由插件框架提供
typedef void (*PF_Send_Response_Func)(PRsp_Ele_Stream pele_str);

//初始化插件信息
typedef struct Plugin_Init_St
{
    PF_Service_Register_Func register_func;//服务注册函数,要注册一系列的枚举值。插件可以处理的服务枚举值
    PF_Invoke_Service_Func invoke_serv_func;//和其他组件交互时,调用的用于和其他组件交互的函数。发送请求消息。
    PF_Send_Response_Func send_rsp_func;//再设计一个回复响应消息的接口。收到异步请求后,处理完毕后通知请求模块处理结果。
} Plugin_Init_St, *PPlugin_Init_St;

//初始化插件函数,类似于构造函数。由插件提供,供插件框架加载插件时初始化插件使用。
void PF_Init_Plugin(PPlugin_Init_St pinit_info);

      插件在函数PF_Init_Plugin中调用函数register_func来注册插件要处理的消息类型。

 

服务的调用
//信元结构体
typedef struct Ele_St
{
    Ele_Tag tag;
    Ele_Length len;
    Ele_Value  value;
    PEle_St next;
}Ele_St, *PEle_St;

//请求消息,信元流格式。
typedef struct Req_Ele_Stream
{
    Plugin_ID src_id;//源插件id
    Service_Type req_type;//请求类型
    PEle_St ele;
} Req_Ele_Stream, *PReq_Ele_Stream;

//响应消息,信元流格式。
typedef struct Rsp_Ele_Stream
{
    Plugin_ID dest_id;//目的插件id
    Service_Type req_type;//响应对应的请求的类型。
    Execute_Result result;//记录执行结果
    Execute_Reason reason;//记录执行结果的原因
    PEle_St ele;
} Rsp_Ele_Stream, *PRsp_Ele_Stream;

//接收插件调用服务请求函数,由插件提供,入参为请求信元流。返回值为响应信元流,用于同步请求处理。
PRsp_Ele_Stream PF_Receive_Invoke_Proc(PReq_Ele_Stream pele_str);

//插件收到响应消息的处理入口函数,由插件提供。如此为响应信元流。
void PF_Receive_Rsponse_Porc(PRsp_Ele_Stream pele_str);

插件间的依赖关系是通过信元流来实现的。至于信元流的使用在我的另一篇博客 中有描述。插件对外的接口都是统一的。

如果插件要和其他的插件通信,则调用PF_Init_Plugin函数的传递的服务调用接口: invoke_serv_func。插件框架根据信元流的类型,查找驱动表,找到对应的服务接收函数。插件用函数PF_Receive_Invoke_Proc接受其他插件的请求,此函数是插件想插件框架主动注册到驱动表的。

如果服务时同步的,这直接通过此函数返回,返回的信息在响应信元流中。如果是异步的请求,这插件在处理完成后,通过 send_rsp_func函数来发送响应。

 

插件的卸载
//卸载插件时调用的函数,类似于析构函数。由插件提供,供插件框架卸载插件时调用。
void PF_Destroy_Func();

转载地址:https://blog.csdn.net/lclflash/article/details/8856818 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:用C++实现插件体系结构
下一篇:构建自己的C/C++插件开发框架(三)——总体结构

发表评论

最新留言

表示我来过!
[***.240.166.169]2023年03月11日 13时31分15秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

最新文章

操作系统笔记---- 2019-12-08 11:36:42
操作系统同步互斥问题 2019-12-08 11:36:43
C++中值传递(pass-by-value)和引用传递(pass-by-reference) 2019-12-08 11:36:40
python的模块导入 2019-12-08 11:36:40
C++中const用法 2019-12-08 11:36:41
操作系统原理学习(第一周)_操作系统概述 2019-12-08 11:36:41
操作系统原理学习(第三周_上)_进程 2019-12-08 11:36:41
操作系统原理学习(第二周)_操作系统结构 2019-12-08 11:36:41
操作系统原理学习_第三周(下)_进程 2019-12-08 11:36:41
(四)建筑物多边形化简系统——“去尾巴”和分割复杂多边形 2019-12-08 11:36:39
shp系列(二)——利用C++进行shp文件的读(打开) 2019-12-08 11:36:39
shp系列(三)——利用C++进行DBF文件的读(打开) 2019-12-08 11:36:39
shp系列(四)——利用C++进行Shx文件的读(打开) 2019-12-08 11:36:39
shp系列(五)——利用C++进行shp文件的写(创建) 2019-12-08 11:36:39
shp系列(六)——利用C++进行Dbf文件的写(创建) 2019-12-08 11:36:40
shp系列(七)——利用C++进行Shx文件的写(创建) 2019-12-08 11:36:40
利用道格拉斯·普客法(DP法)压缩矢量多边形(C++) 2019-12-08 11:36:40
算法学习(2)--数组、链表和跳表的基本实现与特性 2019-12-08 11:36:37
(五)建筑物多边形化简系列——最小外接矩形的获取 2019-12-08 11:36:38
计算机知识记录本 2019-12-08 11:36:38