[七天乐]总结一下插件的做法  |
小工头 发表于 2006/6/18 14:00:23 | 最近的主要任务就是学习插件的做法,幸运的是俺成功了,哦耶~
先从DLL的做法说起吧。插件不一定非得是DLL,但是用DLL做插件很方便,可以把做DLL看成是做插件的基础。
用VC做的DLL可以分为三种:non-MFC,regular MFC以及MFC extension。non-MFC指的是不使用MFC,单纯使用C/C++做出来的DLL,接口符合标准DLL的规定,具有良好的兼容性和可移植性。只要接口符合标准,别的开发工具比如VB、DELPHI等等,都可以做出这样的DLL来。regular MFC指的是内部使用了MFC控件,但对外接口仍然符合标准的DLL。由于使用了MFC,这类DLL往往做得比较花,可以拥有自己的图形化交互界面。MFC extension是继承MFC中的类,对已有的MFC控件进行扩展,对外接口不符合DLL标准(一个典型的例子就是做界面有时候会用到的CJLibrary,还有MFC本身)。对于一般程序来说,regular MFC更适合用来做插件。
DLL的对外接口的定义方式有两种。一种是使用专门的.def文件,标明要导出的接口,例如export function @ 1。这种做法的好处是真正的源代码不需要加上一堆看起来很古怪的类型声明,可以直接用到其他程序中去,而且还支持不使用接口名称,通过序号来直接调用接口。不过,现在这么做的是越来越少了。还有一种做法就是直接在接口定义时声明,也就是在接口名称前面加上 __cdeclspec(dllexport)或者__stdcall(dllexport)。俺的主程序是VC写的,插件一般用__cdeclspec(dllexport),__stdcall貌似用来与其他语言写成的主程序配合。多说一句,这个__stdcall用得其实很多,WINAPI和CALLBACK之类的关键字实际上都是__stdcall。
DLL的调用方法也分为两种。一种是隐式调用。和调用静态库(.lib)的方式一样,在源文件写上#include ***.h(接口的声明文件),编译时把DLL生成时同时生成的lib文件连接进去,运行的时候把DLL和应用程序放在同意目录下就行。隐式调用必须事先获取DLL的相关代码,这对于先于插件开发的应用程序来说是没法做到的,而且也没法对插件进行扩展,因此插件多半使用的是显式调用。在应用程序中使用LoadLibrary()获取DLL句柄,然后用GetProcAccess()获取接口的句柄,然后调用接口,最后用FreeLibrary()释放DLL句柄。因此,可以把插件的DLL集中到规定好的目录里,程序初始化的时候挨个地读DLL,再挨个地调用。显式调用具有很好的灵活性,但它也有缺陷:必须事先知道接口的名称和形参的类型以及个数。
综上所述,用VC做插件,必须满足这么几条:一,接口符合DLL标准;二,接口的名称和定义必须统一(比如都叫Run())。还有一点,显式调用没法导出类,最多只能导出一个类的实例的句柄,意义不大。一般来说,插件导出的接口除了完成功能之外,还要有导出插件名称以及图标的接口,这样主程序就可以在界面上动态地显示目前加载的插件。把插件的名称加载到主菜单,可以使用AfxGetApp()->GetMenu()->GetSubMenu(n)->AppendMenu...;把插件的名称加载到右键菜单,可以使用LoadMenu()->GetSubMenu(0)->AppendMenu;把插件的图标加载到浮动工具栏,可以使用GetToolBarCtrl()->AddButton()。有一点值得注意,在CMainFrame::OnCreate()中可以很方便地动态修改工具栏,但是修改主菜单的话运行时会报错,大概是因为当时菜单还没有生成;在C....View::OnInitUpdate()中可以方便地修改主菜单和右键菜单,可是没法访问CMainFrame的成员变量m_wndToolBar,也就没法修改工具栏。因此,也许应该用一个public的成员变量来代替m_wndToolBar。
最后介绍一个参考文献:VC++实现应用程序对插件的支持http://www.yesky.com/459/1701959.shtml
|
|
|

.: 公告
有人的地方就有恩怨 有恩怨的地方就是江湖 人在江湖漂,谁能不挨刀 |
|
« | September 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | | | | |
|
.: 我的分类(专题)
|

.: 最新日志
.: 最新回复
|

blog名称:少年包工头的工作日记 日志总数:629 评论数量:1458 留言数量:56 访问次数:8978754 建立时间:2004年12月8日 |
|

.: 留言板
|

.: 链接
|

|