我在前面的一篇文章《反向(或者後向)插件系統設計》中介紹了一種實現插件架構的方法,可是沒有給出實現的方法。本文就來說一講如何基於PluginRT進行插件編程。PluginRT是前面提到的插件系統設計思想的C++實現。編程
在上一篇文章《模塊化編程思想及(C++)實踐》中,我講到了模塊化編程思想,其實插件化和模塊化在本質上沒有太大的區別,甚至模塊化的概念外延比插件化還要更廣。因此兩種實踐有不少的類似之處。架構
名稱。全局範圍內代表該插件獨一無二的標識。ide
依賴。稱插件運行引用的其餘插件爲依賴。模塊化
接口。將插件對外提供的服務稱爲接口。函數
加載插件配置文件,掃描插件列表,分析插件之間的依賴。spa
按照插件之間的依賴順序依次加載全部插件。插件
全部插件加載成功後,啓動全部插件。設計
在應用程序退出前,中止全部插件。code
按照反依賴順序卸載全部插件。視頻
根據插件管理的要求,每一個插件都必須實現下面的四個接口函數:
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插件的實現方式和普通插件沒什麼區別。
插件配置文檔的基本內容包含兩個部分:
Application節點,該節點必須實現,是程序的入口點。
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>