[软件架构]基于PluginRT的插件编程

2014/10/11 09:51
阅读数 993

我在前面的一篇文章《反向(或者后向)插件系统设计》中介绍了一种实现插件架构的方法,但是没有给出实现的方法。本文就来讲一讲如何基于PluginRT进行插件编程。PluginRT是前面提到的插件系统设计思想的C++实现。

插件架构

在上一篇文章《模块化编程思想及(C++)实践》中,我讲到了模块化编程思想,其实插件化和模块化在本质上没有太大的区别,甚至模块化的概念外延比插件化还要更广。所以两种实践有很多的相似之处。

插件构成

  1. 名称。全局范围内表明该插件独一无二的标识。

  2. 依赖。称插件运行引用的其他插件为依赖。

  3. 接口。将插件对外提供的服务称为接口。

插件管理

  1. 加载插件配置文件,扫描插件列表,分析插件之间的依赖。

  2. 按照插件之间的依赖顺序依次加载所有插件。

  3. 所有插件加载成功后,启动所有插件。

  4. 在应用程序退出前,停止所有插件。

  5. 按照反依赖顺序卸载所有插件。

插件接口

根据插件管理的要求,每个插件都必须实现下面的四个接口函数:

extern"C" __declspec(dllexport) bool OnPluginLoad(PluginRuntime *env);
extern"C" __declspec(dllexport) bool OnPluginStart();
extern"C" __declspec(dllexport) bool OnPluginStop();
extern"C" __declspec(dllexport) bool OnPluginUnload();

其中:

  • OnPluginLoad用于插件加载阶段,在所有插件运行之前做好本插件需要做的工作,比如初始化当前插件的资源、注册当前插件提供的PluginRuntime函数、记录全局的PluginRuntime运行时等。

  • OnPluginStart用于插件启动阶段,这时候所有插件的准备工作均已就绪。

  • OnPluginStop用于插件停止阶段,在应用程序退出前停止所有插件。

  • OnPluginUnload用于插件卸载阶段,主要是资源清理等工作。

应用程序

应用程序指的是可执行程序,在Windows上通常以.exe为文件名后缀。在本文实现的插件结构内,应用程序也被当做插件的节点,因为应用程序也通常会提供一些插件服务。Application插件的实现方式和普通插件没什么区别。

插件配置

插件配置文档的基本内容包含两个部分:

  1. Application节点,该节点必须实现,是程序的入口点。

  2. Plugin节点,该节点是可选节点。注意插件之间的依赖关系。

配置文档的内容格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<PluginConfig>
         <Application Tag="CamShow">
                   <Discription><![CDATA[程序启动模块]]></Discription>
                   <Depends><![CDATA[]]></Depends>
                   <Path Type="Relative"><![CDATA[CamShow.exe]]></Path>
         </Application>
         <Plugin Tag="VideoWidget">
                   <Discription><![CDATA[视频控制插件]]></Discription>
                   <Depends><![CDATA[CamShow;]]></Depends>
                   <Path Type="Relative"><![CDATA[..\Plugin\VideoWidget\VideoWidget.dll]]></Path>
         </Plugin>
         <Plugin Tag="CanvasWidget">
                   <Discription><![CDATA[绘图控制插件]]></Discription>
                   <Depends><![CDATA[CamShow;]]></Depends>
                   <Path Type="Relative"><![CDATA[..\Plugin\CanvasWidget\CanvasWidget.dll]]></Path>
         </Plugin>
</PluginConfig>

编程实践

参见:https://pluginrt.codeplex.com/


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部