[軟件架構]基於PluginRT的插件編程

我在前面的一篇文章《反向(或者後向)插件系統設計》中介紹了一種實現插件架構的方法,可是沒有給出實現的方法。本文就來說一講如何基於PluginRT進行插件編程。PluginRT是前面提到的插件系統設計思想的C++實現。編程

插件架構

在上一篇文章《模塊化編程思想及(C++)實踐》中,我講到了模塊化編程思想,其實插件化和模塊化在本質上沒有太大的區別,甚至模塊化的概念外延比插件化還要更廣。因此兩種實踐有不少的類似之處。架構

插件構成

  1. 名稱。全局範圍內代表該插件獨一無二的標識。ide

  2. 依賴。稱插件運行引用的其餘插件爲依賴。模塊化

  3. 接口。將插件對外提供的服務稱爲接口。函數

插件管理

  1. 加載插件配置文件,掃描插件列表,分析插件之間的依賴。spa

  2. 按照插件之間的依賴順序依次加載全部插件。插件

  3. 全部插件加載成功後,啓動全部插件。設計

  4. 在應用程序退出前,中止全部插件。code

  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/

相關文章
相關標籤/搜索