在DELPHI应用程序中使用DLL

转载 2004年09月21日 21:44:00

 

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

  1、用Delphi创建DLL

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

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

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

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

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

  FunctionName(argment):Boolean;export;

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

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

  2、DLL的调用

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

  (1)装载时调用DLL

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

  Implementation

  Uses Dialogs;

  Function Name(argment):Boolean;far;External′CallName′;

  ......

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

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

  (2)运行时调用DLL

  DLL的另一种调用方法是在运行时调用。要调用到Windows的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的创建以及运行时调用的示例,该DLL主要用来检查输入的口令是否正确,窗体含有一个Edit编辑框,两个按钮Button,一个标签Label,在编辑框内输入口令,根据比较结果返回真假值。

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

  unit Main;

  interface

  uses WinTypes,WinProcs,Classes,Graphics,Forms,Controls,StdCtrls,ExtCtrls;

  type

  TForm1=class(TForm)

  Edit1:TEdit;

  Label1:TLabel;

  Button1:TButton;

  Bevel1:TBevel;

  GroupBox1:TGroupBox;

  StatusLbl:TLabel;

  procedure Button1Click(Sender:TObject);

  end;

  TGetPass=function(aa:string):boolean;

  var

  Form1:TForm1;

  getpass:TGetpass;

  lhnd:THandle;

  aptr:TFarproc;

  implementation

  uses Dialogs;

  {$R*.DFM}

  {Import routine from DLL.Takes password to matchand returns boolean.}

  {function GetPassword(Password:string):Boolean;far;external′CHKPWORD′;}

  {Call password check routine,show status informcaption.}

  procedure TForm1.Button1Click(Sender:TObject);

  begin

  if Edit1.Text=′′then

  begin

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

  Edit1.SetFocus;

  end

  else

  begin

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

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

  if TGetpass(aptr)(Edit1.Text) then

  StatusLbl.Caption:=′Verifiedpassword′

  else

  StatusLbl.Caption:=′Invalid password′;

  freelibrary(lhnd);

  end;

  end;

  end.

  {dllform.pasDLL模块}

  unit Dllform;

  interface

  uses WinTypes,WinProcs,Classes,Graphics,Forms,Controls,Buttons,SysUtils,StdCtrls;

  type

  TPasswordForm=class(TForm)

  Edit1:TEdit;

  Label1:TLabel;

  BitBtn2:TBitBtn;

  BitBtn1:TBitBtn;

  end;

  function GetPassword(Password:string):Boolean;export;

  implementation

  uses Dialogs;

  {$R*.DFM}

  function GetPassword(Password:string):Boolean;

  var

  PasswordForm:TPasswordForm;

  begin

  Result:=False;

  PasswordForm:=TPasswordForm.Create(Application);

  try

  with PasswordForm do

  if ShowModal=mrOK then

  if UpperCase(Edit1.Text)<>UpperCase(Password) then

  MessageDlg(′Invalid Password′,mtWarning,[mbOK],0)

  else

  Result:=True;

  finally

  PasswordForm.Free;

  end;

  end;

  end.


 

Delphi动态调用C++写的DLL

c++ DLL 文件,建议用最简单的c++编辑工具。不会加入很多无关的DLL文件。本人用codeblocks+mingw。不像 VS2010,DLL编译成功,调用的时候会提示缺其他DLL。 系统生成的...
  • mycoolme5
  • mycoolme5
  • 2016年04月13日 16:51
  • 529

Delphi调用C写的dll

一.用C语言写了一个Dll,编译成功。 是一个非常简单的加密算法,代码如下: #include __declspec(dllexport) void Encipher(char a[16])  ...
  • farrellcn
  • farrellcn
  • 2014年01月17日 20:10
  • 1410

使用package(包功能)实现DLL与主程序的数据库连接共享(Delphi版)

1、使用Package实现 如何使用Delphi开发大型主从架构系统-Package的秘密和威力 相信许多人和我一样,在使用Delphi开发应用系统的时候,一定会想到如何的切割整个应用系统。是把所...
  • pnf88
  • pnf88
  • 2015年02月09日 23:58
  • 1238

Delphi7程序调用C#写的DLL解决办法(DLL)

近来,因工作需要,必须解决Delphi7写的主程序调用C#写的dll的问题。在网上一番搜索,又经过种种试验,最终证明有以下两种方法可行:     编写C#dll的方法都一样,首先在vs2005中创建...
  • zlwzlwzlw
  • zlwzlwzlw
  • 2015年02月10日 10:15
  • 2662

Delphi 编写DLL动态链接库文件的知识和样例

一、DLL动态链接库文件的知识简介:                   Windows的发展要求允许同时运行的几个程序共享一组函数的单一拷贝。动态链接库就是在这种情况下出现的。动态链接库不用重...
  • zang141588761
  • zang141588761
  • 2016年04月26日 10:10
  • 4867

Delphi下的原生ADO使用方法

本文向您揭示在Delphi中使用ADO是如何轻而易举,结合了ADO的Delphi应用程序,将不再依赖于BDE。 ADO的精髓在于利用简单的COM指令来快速方便的访问ODBC数据源,微软的表格、...
  • Hmillet
  • Hmillet
  • 2016年03月30日 09:55
  • 2438

delphi 在DLL中添加窗体

方案一:   在DLL工程中新建一个FORM窗体.在窗体中加入如下代码:   1.首先需要再 implementation 之前声明下以下函数. 1 procedure Sy...
  • farrellcn
  • farrellcn
  • 2016年05月25日 10:44
  • 1645

内存中加载DLL DELPHI版

//从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointe...
  • q46mu28wem
  • q46mu28wem
  • 2017年05月22日 21:16
  • 151

Delphi调用DLL中的接口

最近很少上论坛,这几次发现好几个问题都是围绕如何使用DLL中的接口而展开的。 问题描述: 具体问题就是在隐式使用接口变量后,在FreeLibrary执行后,就会出现一个非法访址的错误。 ...
  • yanjinrong
  • yanjinrong
  • 2014年11月02日 10:57
  • 1208

delphi 开发中遇到的DLL问题思考及解决方法

最近在公司写一个外壳程序,调用DLL插件把FORM嵌入到EXE中的一个PANEL中,其中遇到了不少的问题,大部分已经解决,还有几个至今没有找到解决方法,有待研究,也希望知道解决方法的富翁共享一下研究成...
  • spd260
  • spd260
  • 2013年02月22日 13:08
  • 921
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在DELPHI应用程序中使用DLL
举报原因:
原因补充:

(最多只允许输入30个字)