admin管理员组文章数量:1535448
2024年6月19日发(作者:)
初探Delphi 7 中的插件编程
1 前言
1.1 写作目的
我写Delphi程序是从MIS系统入门的,开始尝试子系统划分的时候采用的是MDI窗体的结
构。随着系统功能的扩充,不断有新的子系统加入系统中,单个工程会变得非常大,每次做
一点修改都要重新编译,单个工程的形式也不利于团队协作。为了提高工作效率,我希望利
用DLL动态链接库的形式实现插件结构的编程。
插件结构的编程需要一个插件容器来控制各DLL的运行情况,将划分好的每个子系统安排
到一个DLL库文件中。对每个DLL程序需要为容器预留接口函数,一般接口函数包括:启
动调用DLL库的函数、关闭DLL库的函数。通过接口函数,插件容器可以向DLL模块传
递参数实现动态控制。具体实现细节我将在下文说明并给出响应代码。
1.2 阅读对象
您可能需要先了解一下DELPHI中UNIT的结构,工程的结构。本文没有深入讨论DLL编
程的理论细节,只是演示了一些实用的代码,我当时学习的是刘艺老师的《DELPHI深入编
程》一书。
2 示例程序简介
为了便于阅读我将使用一个MIS系统的部分程序代码演示插件编程的一些方法。示例程序
是典型的C/S结构DBMS应用程序,我们关注的部分将是框架程序(下文简称Hall)的控
制语句和dll插件程序的响应控制。
2.1 程序结构
插件容器Hall使用一个独立的工程创建,Hall的主窗口的作用相当于MDI程序中的MDI
容器窗体,Hall中将显式调用Dll中的接口函数。
每个插件程序独立使用各自的工程,与普通工程不同的是,DLL工程创建的是Dll Wizard,
相应编译生成的文件是以DLL为后缀。
2.2 接口设计
实例程序Narcissus中我们预留两个接口函数:
ShowDLLForm
该函数将应用程序的句柄传递给DLL子窗口,DLL程序将动态创建DLL窗体的实例。还
可以将一些业务逻辑用参数的形式传递给DLL子窗口,比如窗体名称、当前登陆的用户名
等。初次调用一个DLL窗体实例时使用此函数创建。
FreeDLLForm
该函数将显示释放DLL窗口实例,在退出应用程序时调用每个DLL窗体的FreeDLLForm
方法来释放创建的实例,不然会引起内存只读错误。同样,也可以将一些在释放窗体时需要
做的业务逻辑用参数的形式传递给DLL窗体。
2.3 调试方式
DLL窗体程序无法直接执行,需要有一个插件容器来调用。应此我们需要先实现一个基本
的Hall程序,然后将保存在一个固定的目录中。对每个DLL工程做如下设置:
1. 打开DLL工程
2. 选择菜单 Run – Parameters
3. 在弹出的窗口中浏览到我们的容器这样在调试DLL程序时将会自动调用
Hall程序,利用Hall中预留的调用接口调试DLL程序。
3 插件程序的基本实现
DLL程序的设计方式和普通WINAPP没有很大的区别,只是所有的窗口都是作为一种特殊
的“资源”保存在DLL库中,需要手动调用,而不像WINAPP中会有工程自动创建。声明接
口函数的方法很简单
1. 在Unit的Implementation部分中声明函数
2. 在函数声明语句的尾部加上stdcall标记
3. 在工程代码(Project – View Source)的begin语句之前,用exports语句声明函数接口
为了使代码简洁,我个人喜欢在工程中独立添加一个Unit单元(File – New -- Unit),然后
将所有要输出的函数体定义在此单元中,不要忘记将引用到的窗体的Unit也uses进来。我
命名这个单元为UnitEntrance,在ShowDLLForm函数中初始化了要显示的窗口并调用Show
方法显示,HALL会将登陆的用户名用参数传递过来,得到用户名后就可以进行一些权限控
制,表现在界面初始化上。
其代码如下
unit UnitOfficeEntrance;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms;
function ShowDLLForm(AHandle: THandle; ACaption: string; AUserID: string):boolean;stdcall;
function FreeDLLForm(AHandle: THandle; ACaption: string; AUserID: string):boolean;stdcall;
implementation
uses UnitOfficialMainForm; // 改成MAINFORM的unit
var
DLL_Form:TFormOfficialMain; //改成MAINFORM的NAME
//-----------------------------------------
//Name: ShowDLLForm
//Func: DLL插件调用入口函数
//Para: AHandle 挂靠程序句柄; ACaption 本窗体标题
//Rtrn: N/A
//Auth: CST
//Date: 2005-6-3
//-----------------------------------------
function ShowDLLForm(AHandle: THandle; ACaption: string; AUserID: string):boolean;
begin
result:=true;
try
:=AHandle; //挂靠到主程序容器
DLL_Form:=(Application); //改成MAINFORM的NAME
try
with DLL_Form do
begin
Caption := ACaption;
[0].Text := AUserID;
//Configure UI
Show ;
end;
except
on e:exception do
版权声明:本文标题:初探Delphi 7 中的插件编程 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1718779774a724060.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论