发信人: lofe ()感激生活(), 信区: BorlandDev
标  题: 在Delphi应用程序中使用DLL 
发信站: 哈工大紫丁香 (Mon Sep  4 16:08:35 2000), 转信

在Delphi应用程序中使用DLL 

广西 李澄 
  Delphi与VisualBasic、VisualFoxPro等软件一样,
属于RAD工具(快速应用开发工具)。适合开发32位或16位
/32位混合应用程序。Delphi所使用的程序语言是Object
Pascal,是结构化、面向对象的编译型语言,具有高执行
效率、可重用性、易维护性,及较强的异常处理能力、类
封装能力等。VB与Delphi相比,VB不能对程序进行编译,
只能解释执行,更重要的不同是Delphi具有较强的继承性
,Delphi的应用程序可编译DLL模块,VB却无法编译,只
能调用C编译的DLL。而Delphi不仅可调用C++产生的DLL
模块,同样C++程序也可调用Delphi所产生的DLL部件。
这样交互调用,无须重复开发,大大缩短了生产周期。

   一、用Delphi创建DLL

  Delphi的DLL创建并不复杂,下面向大家介绍Delph
i的DLL创建方法。

  1、首先创建一个新的DLL项目(NewProject),因为
DLL与调用它的主程序要分开编译。如果DLL模块已经建立
在调用它的项目中(Project),则将它的窗体(Form)
从Project移出,另建一个新的项目(NewProject)。只需
从File菜单选中NewProject项,然后将DLL的Pas模块文件
加入到项目中,再将其自动建立的Form1删除即可。

  2、在DLL的DPR文件中把Program关键字改为Librar
y,申明为动态链接库,在USES语句后面加入ExPorts语句
,指明调用DLL的函数名。

  3、如果主程序的DPR文件已有DLL窗体CreateForm的
语句,则将其去掉。

  4、在DLL的Pas文件中Type......End后加入该
DLL的函数或过程的声明,形式如:

  FunctionName(argment):Boolean;export;

  该函数或过程应加入窗体的Create和Free(产生和释
放)方法。

  5、对项目进行编译即可。

   二、DLL的调用

  调用DLL有两种方法,一种是在应用程序装载时调用
,另一种是在应用程序运行时调用。首先介绍装载时DLL的
调用:

  (1)装载时调用DLL

  在调用DLL的Pas文件中,对DLL函数进行外部声明,
声明应位于Implementation的Uses语句后,形式如下:

  Implementation

  UsesDialogs;

  FunctionName(argment):Boolean;far;Externa
l′CallName′;

  ......

  其中External关键字后面的引号内的字串是DLL的文
件名。声明以后即可在Pas文件任何地方引用DLL函数。

  装载时调用DLL的优点是速度较快,程序间也可共享
代码。

  (2)运行时调用DLL

  DLL的另一种调用方法是在运行时调用。要调用到Win
dows的API函数:loadlibrary,Getprocaddress等。主要
用于调用DELPHI和其它语言,特别是C++编译的DLL。

  假定你的DLL包括一个函数:

  FunctionMyFunc(aparam:word):string;export


  首先在程序Type类型声明处加入一句:

  Type

  TMyfuncΚfunction(aparam:word):string;

  此句的作用如同C++中声明的函数指针。

  然后定义如下变量∶

  Var

  aptr:TFarproc;

  lhnd:THandle;

  s:string;

  其中Aptr,lhnd两变量声明必须有,s是DLL函数返回
值,视情况而定。

  在调用DLL处加入如下语句进行DLL装载:

  lhnd:ΚLoadlibrary(′路径ιDLL文件名′);{
如lhnd:ΚLoadlibrary(′c:ιaaιbb.dll′);

  aptr:ΚGetprocAddress(lhnd,′Myfunc′);

  下面可直接调用DLL了:

  s:ΚTMyfunc(bptr)(60);{根据函数填相应的
变量参数}

  调用完以后,用FreeLibrary释放DLL占用的内存:

  FreeLibrary(lhnd);

  下面给出一个DLL的创建以及运行时调用的示例,该D
LL主要用来检查输入的口令是否正确,窗体含有一个Edit
编辑框,两个按钮Button,一个标签Label,在编辑框内
输入口令,根据比较结果返回真假值。

  {main.pas主程序(运行时调用DLL)}

  unitMain;

  interface

  usesWinTypes,WinProcs,Classes,Graphics,

  Forms,Controls,StdCtrls,

  ExtCtrls;

  type

  TForm1Κclass(TForm)

  Edit1:TEdit;

  Label1:TLabel;

  Button1:TButton;

  Bevel1:TBevel;

  GroupBox1:TGroupBox;

  StatusLbl:TLabel;

  procedureButton1Click(Sender:TObject);

  end;

  TGetPassΚfunction(aa:string):boolean;

  var

  Form1:TForm1;

  getpass:TGetpass;

  lhnd:THandle;

  aptr:TFarproc;

  implementation

  usesDialogs;

  {$R*.DFM}

  {ImportroutinefromDLL.Takespasswordtomatchan
dreturnsboolean

  .}

  {functionGetPassword(Password:string):Boo
lean;

  far;external′CHKPWORD′;}

  {Callpasswordcheckroutine,showstatusinformca
ption.}

  procedureTForm1.Button1Click(Sender:TObject
);

  begin

  ifEdit1.TextΚ′′then

  begin

  MessageDlg(′Entersamplepasswordfirst′,mt
Information,[mbOK],0);

  Edit1.SetFocus;

  end

  else

  begin

  lhnd:Κloadlibrary(′Chkpword.dll′);

  aptr:Κgetprocaddress(lhnd,′GetPassword′
);

  ifTGetpass(aptr)(Edit1.Text)then

  StatusLbl.Caption:Κ′Verifiedpassword′

  elseStatusLbl.Caption:Κ′Invalidpassword′


  freelibrary(lhnd);

  end;

  end;

  end.

  

  {dllform.pasDLL模块}

  unitDllform;

  interface

  usesWinTypes,WinProcs,Classes,Graphics,For
ms,Controls,

  Buttons,SysUtils,StdCtrls;

  type

  TPasswordFormΚclass(TForm)

  Edit1:TEdit;

  Label1:TLabel;

  BitBtn2:TBitBtn;

  BitBtn1:TBitBtn;

  end;

  functionGetPassword(Password:string):Boole
an;export;

  implementation

  usesDialogs;

  {$R*.DFM}

  functionGetPassword(Password:string):Boole
an;

  var

  PasswordForm:TPasswordForm;

  begin

  Result:ΚFalse;

  PasswordForm:ΚTPasswordForm.Create(Applica
tion);

  try

  withPasswordFormdo

  ifShowModalΚmrOKthen

  ifUpperCase(Edit1.Text)ΙΛUpperCase(Passw
ord)then

  MessageDlg(′InvalidPassword′,mtWarning,[
mbOK],0)

  else

  Result:ΚTrue;

  finally

  PasswordForm.Free;

  end;

  end;

  end.

  本程序在Windows3.1,Delphi1.0及Windows95,de
lphi2.0环境下调试通过。

   

返回主页

--
      -------丈夫处世兮立功名;立功名兮慰平生。
                  慰平生兮吾将醉;吾将醉兮发狂吟!--------
                                                      
※ 修改:.haojs 于 Sep  4 16:04:15 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.683毫秒