Delphi 插件(Plug-ins)创建、调试与使用应用程序扩展
有没有使用过Adobe Photoshop?如果用过,你就会对插件的概念比较熟悉。
对外行人来说,插件仅仅是从外部提供给应用程序的代码块而已(举个例子来说,在
一个DLL中)。一个插件和一个普通DLL之间的差异在于插件具有扩展父应用程序功能
的能力。例如,Photoshop本身并不具备进行大量的图像处理功能。插件的加入使其
获得了产生诸如模糊、斑点,以及其他所有风格的奇怪效果,而其中任何一项功能都
不是父应用程序自身所具有的。
对于图像处理程序来说这很不错,可是为什么要花偌大的力气去完成支持插件的商业
应用程序呢?假设,我们举个例子,你的应用程序要产生一些报表。你的客户肯定会
一直要求更新或者增加新的报表。你可以使用一个诸如Report Smith的外部报表生成
器,这是个不怎么样的解决方案,需要发布附加的文件,要对用户进行额外的培训,
等等。你也可以使用QuickReport,不过这会使你身处版本控制的噩梦之中棗如果每
改变一次字体你就要Rebuild你的应用程序的话。
然而,只要你把报表做到插件中,你就可以使用它。需要一个新的报表吗?
没问题,只要安装一个DLL,下次应用程序启动时就会看见它了。另外一个例子是处理
来自外部设备(比如条形码扫描器)的数据的应用程序,为了给用户更多的选择,你
不得不支持半打的各种设备。通过将每种设备接口处理例程写成插件,不用对父应用
程序作任何变动就可以获得最大程度的可伸缩性。
入门
在开始写代码之前最重要的事情就是搞清楚你的应用程序到底需要扩展哪
些功能。这是因为插件是通过一个特定的接口与父应用程序交互的,而这个接口将
根据你的需要来定义。在本文中,我们将建立3个插件,以便展示插件与父应用程
序相交互的几种方式。
我们将把插件制作成DLL。不过,在做这项工作之前,我们得先制作一个外
壳程序来载入和测试它们。图1显示的是加载了第一个插件以后的测试程序。第一个
插件没有完成什么大不了的功能,实际上,它所做的只是返回一个描述自己的字符
串。不过,它证明了很重要的一点棗不管有没有插件应用程序都可以正常运行。
如果没有插件,它就不会出现在已安装的插件列表中,但是应用程序仍然可以正常
的行使功能。
图1:插件测试外壳程序
我们的插件外壳程序与普通应用程序之间的唯一不同就在于工程源文件
中出现在uses子句中的Sharemem单元和加载插件文件的代码。任何在自身与%