最近因开发需要拜读了网上几篇关于平台与插件的大作,对其思想有了初步的了解。

归纳一下平台主要需要解决以下几个问题:

1、定义好插件需要实现的接口;

2、枚举加载计算机中可用于本平台的插件;

3、加载可用插件并动态加载插件的菜单及工具栏,或其他GUI资源;

4、管理动态菜单及工具栏的命令调用,及其他GUI的右键菜单等等命令调用;

5、平台与插件的数据交互;

6、插件卸载等等;

下面细说一下以上几个要点。

定义接口:

主要是定义好平台需要调用的几个公共方法,并通过这些方法的调用获取插件必须的一些信息,如插件实现什么功能,提供了哪些菜单工具栏命令等,及命令调用的方法;

枚举插件:

即查询注册表的组件目录方法获取事先约定好的组件目录下注册的插件;

 ICatInformationPtr pICatInformation(CLSID_StdComponentCategoriesMgr);
IEnumCLSID *  pIEnumCLSID  =  NULL ;
CATID catid  =  CATID_PLATFORMCMD;  //  约定的组件目录guid
 HRESULT hr  =  pICatInformation -> EnumClassesOfCategories( 1 ,  & catid,  0 , NULL,  & pIEnumCLSID);

 if  (FAILED(hr))
 {
return S_FALSE;
}
CLSID clsid;
 //  枚举插件
 while  ((hr  =  pIEnumCLSID -> Next( 1 ,  & clsid, NULL))  ==  S_OK)
 {
// 可以在此创建并加载插件获取插件的信息
}

加载插件的菜单及工具栏和其他GUI资源:

插件的GUI菜单和工具栏资源,可以像在主工程的菜单和工具栏资源一样在插件资源中编辑好,然后由平台加载到框架。其他的GUI资源可以约定一些设置由平台来创建。

插件命令调用:

平台在插件的菜单与工具栏加载过程中对原有的命令id进行偏移并记录偏移后的命令与原命令的映射,以便平台来调用插件的方法;

平台与插件的数据交互:

平台与插件数据交换;可以很简单也可以很复杂,目前我所能想到的最简单的方法是定义一个接口,此接口实现一对数据名称与数据的映射的存取;

插件卸载:

很简单没有什么好说的......

说了这么多废话源代码最重要;

我已实现了一个简单的测试例子本

没有加载插件时:

通过平台将插件融合于架构_通过平台将插件融合于架构

加载2个插件后:

通过平台将插件融合于架构_工具_02