科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件初探Delphi中的插件编程

初探Delphi中的插件编程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

插件结构的编程需要一个插件容器来控制各DLL的运行情况,将划分好的每个子系统安排到一个DLL库文件中。

作者:caishaoting 来源:CSDN BLOG 2007年10月31日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
插件程序的基本实现

  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
  Application.Handle:=AHandle; //挂靠到主程序容器
  DLL_Form:=TFormOfficialMain.Create(Application); //改成MAINFORM的NAME
 try
  with DLL_Form do
  begin
   Caption := ACaption;
   StatusBar.Panels.Items[0].Text := AUserID;
   //Configure UI
   Show ;
  end;
 except
  on e:exception do
  begin
   dll_form.Free;
  end;
 end;
 except
  result:=false;
  end;
 end;

//-----------------------------------------
//Name: FreeDLLForm
//Func: DLL插件调用出口函数
//Para: AHandle 挂靠程序句柄
//Rtrn: true/false
//Auth: CST
//Date: 2005-6-11
//-----------------------------------------

function FreeDLLForm(AHandle: THandle; ACaption: string; AUserID: string):boolean;
begin
 Application.Handle:=AHandle; //挂靠到主程序容器
 if DLL_Form.Showing then DLL_Form.Close; //如果窗口打开先关闭,触发FORM.CLOSEQUERY可取消关闭过程
 if not DLL_Form.Showing then
 begin
  DLL_Form.Free;
  result:=true;
 end //仍然打开状态,说明CLOSEQUERY.CANCLOSE=FALSE
 else
 begin
  result:=false;
 end;
end;
end.

  DLL工程文件代码如下:

library Official;


{ Important note about DLL memory management: ShareMem must be the

first unit in your library’s USES clause AND your project’s (select

Project-View Source) USES clause if your DLL exports any procedures or

functions that pass strings as parameters or function results. This

applies to all strings passed to and from your DLL--even those that

are nested in records and classes. ShareMem is the interface unit to

the BORLNDMM.DLL shared memory manager, which must be deployed along

with your DLL. To avoid using BORLNDMM.DLL, pass string information

using PChar or ShortString parameters. }


uses

SysUtils,

Classes,

UnitOfficialDetailForm in ’UnitOfficialDetailForm.pas’ {FormOfficialDetail},

UnitOfficialMainForm in ’UnitOfficialMainForm.pas’ {FormOfficialMain},

UnitOfficeEntrance in ’UnitOfficeEntrance.pas’,

UnitOfficialClass in ’..\..\Public\Library\UnitOfficialClass.pas’,

UnitMyDataAdatper in ’..\..\Public\Library\UnitMyDataAdatper.pas’,

UnitMyHeaders in ’..\..\Public\Library\UnitMyHeaders.pas’;


{$R *.res}

exports ShowDLLForm,FreeDLLForm; //接口函数

begin

end.

  插件程序一旦调用了DLL窗口,窗口实例将会保持在HALL窗口的上层,因此不用担心遮挡的问题。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章