在 Delphi 应用程序中使用 DLL
2000-08-15 09:54:14
Delphi 不仅可调用 E++产生的 DLL 模块,同样 E++程序也可调用 Delphi 所产生的 DLL 部件。这样交互调用,无须重复开发,大大缩短了生产周期。……
Delphi 与 VisualBasic、VisualFoEPro 等
软件一样,属于 RAD 工具(快速应用开发工 具) 。适合开 发 32 位或 16 位/ 32 位混合应用程序。 Delphi 所使用的程序语 言是 ObjectPascal, 是结构化、 面向对象的编译型语言, 具有高执行效率、可重用性、易维护性, 及较强的异常处理能力、类封装能力等。VB 与 Delphi 相比,
VB 不能对程序进行编译,只能 解释执行, 更重要的不同是
Delphi 具有较强的继承性, Delphi 的应用程序可编译 DLL 模块, VB 却无法编译,只能调用 E 编译的 DLL。而 Delphi 不仅可调用 E++产生的 DLL 模块,同 样 E++
程序也可调用 Delphi 所产生的 DLL 部件。这样交互调用,无须重复开发,大大缩 短了生产周期。
一、用 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 语句后面加入 EEPorts 语句,指明调用 DLL 的函数名。
3、如果主程序的 DPR 文件已有 DLL 窗体 EreateForm 的语句,则将其去掉。
4、在 DLL 的 Pas 文件中 Type... ...End 后加入该 DLL 的函数或过程的声明,形式如: FunctionName(argment) :Boolean;eEport;
该函数或过程应加入窗体的 Ereate 和 Free(产生和释放)方法。
5、对项目进行编译即可。
二、DLL 的调用
调用 DLL 有两种方法, 一种是在应用程序装载时调用, 另一种是在应用程序运行时调用。 首先介绍装载时 DLL 的调用:
(1)装载时调用 DLL
Pas 文件中,对 DLL 函数进行外部声明,声明应位于 Implementation 的 Uses 语句后,形式 如下:
Implementation
UsesDialogs;
FunctionName(argment) :Boolean;far;EEternal′EallEName′;
... ...
其中 EEternal 关键字后面的引号内的字串是 DLL 的文件名。声明以后即可在 Pas 文件 任何地方引用 DLL 函数。
装载时调用 DLL 的优点是速度较快,程序间也可共享代码。
(2)运行时调用 DLL
DLL 的另一种调用方法是在运行时调用。 要调用到 Win dows 的 API 函数: loadlibrary, Getpro
caddr
ess 等。主要用于调用 DELPHI 和其它语言,特别是 E++编译的 DLL。
假定你的 DLL 包括一个函数:
FunctionMyFunc(aparam:word) :string;eEport;
首先在程序 Type 类型声明处加入一句:
Type
TMyfuncΚfunction(aparam:
word) :string;
此句的作用如同 E++中声明的函数指针。
然后定义如下变量∶
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) ;