messagedlg('file "' + sr.name +
'" is not a valid plugin.',
mtinformation, [mbok], 0);
end;
end
else
begin
messagedlg('an error occurred loading the plugin "' +
sr.name + '".', mtinformation, [mbok], 0);
end;
end;
最后一步是创建插件自身。如同前面的几个例子,插件展示一个标志自身的描述
过程。它也带有一个初始化例程,在本例中只是接受一个tlist作为参数。最后,它还
包含一个没有引出(export)的历程,叫做altermintracksize,它将修改传递给它的
数值。
最终插件的完整代码。
unit main;
interface
uses dialogs, menus, classes;
procedure describeplugin(var desc: string);
export; stdcall;
procedure initpluginevents(lstresize: tlist);
export; stdcall;
procedure altermintracksize(var x, y: integer); stdcall;
implementation
procedure describeplugin(var desc: string);
begin
desc := 'test plugin 3 - minmax';
end;
procedure initpluginevents(lstresize: tlist);
begin
lstresize.add(@altermintracksize);
end;
procedure altermintracksize(var x, y: integer);
begin
x := 270;
y := 220;
end;
end.
最终插件的代码
initpluginevents过程是这个插件的初始化例程。它接受一个tlist作为参数。这
个tlist就是在父应用程序中创建的保存相应函数地址的列表。下面的语句:
lstresize.add(@altermintracksize);
把altermintracksize函数的地址加入到了这个列表中。它被声明为类型stdcall以
便与其他过程相配,不过用不着export指示字。由于函数被直接通过它的地址调用,
所以也就没有必要按照通常的方式把它从dll中引出。
所以,事件序列如下所列:
1、 在应用程序初始化时,创建一个tlist对象。
2、 在启动时这个列表被传递到插件的初始化过程initpluginevents中。
3、 插件过程把一个过程的地址加入到列表中。
4、 每次窗口大小改变时所产生的windows消息wm_getminmaxinfo被我们的应用程
序所捕获。
5、 该消息被我们的消息处理器tfrmmain.mainmaxinfo所处理,见图10。
6、 消息处理器遍历列表并调用它所包含的函数,把当前的x和y最小窗口尺寸作为
参数传递。要注意,tlist类只是存储指针,所以如果想用保存的地址做些什么事情
的话,我们必须把指针转换成所需要的类型--在本例中,要转换成tresizeproc。
tresizeproc = procedure (var x, y: integer); stdcall;
7、 插件过程altermintracksize(列表中的指针所指向的),接受x和y值作为可变
的var参数并且修改它们。
8、 控制权返回到父应用的消息处理器,按照最小窗口尺寸的新值继续运行下去。
9、 应用程序退出时tlist会在主代码的finalization段被释放。
结论
使用该体系结构时,可能利用delphi提供的package功能是个不错的主意。在通
常情况下,我不是一个分割运行时模块的狂热爱好者,但是当你认为任一包含大量代
码的delphi dll超过200kb时,它就开始变得有意义了。
这篇文章应该还是有些用处的,至少它可以让你思考一些程序设计方面的问题,比
如如何让它变得更加灵活。我知道如果我在以前的应用程序中使用一些这种技术的
话,我就可以省掉在修改程序方面的好多工作。我并不想把插件作为一种通用的解
决方案。很明显,有些情况下额外的复杂度无法验证其正确性,或者应用程序压根儿
就不打算把自身搞成几块可扩展的单元。还有一些其它的方法也可以达成同样的效果。
delphi自身提供了一个接口来创作能集成到ide中的模块,比起我所说明的技术这种方
法更加面向对象(或者说更"干净"),而我也确信你可以在自己的应用中模仿这一技
术。在运行时加载delphi包也不是做不到的。探索一下这种可能性吧。
本文所介绍的技术在delphi 4下工作的很好。实际上,delphi 4增加了工程选项,使
这类应用程序加强dll(application-plus-dll)的开发变得更加容易了。