Delphi中动态链接库两种调用方式的比较

合集下载

Delphi中连接数据库的三种方式

Delphi中连接数据库的三种方式

Delphi中连接数据库的三种方式北京航空航天大学余庆利用Delphi 3. 0 可Delphi 3. 0 对访问数据库提供了强有力的支持以开发出功能强大的数据库应用程序。

Delphi 的可视化功能相当强大,制作个简单的仅对数据进行查看和维护的程序十分容易,可以不写任何代码就能实现! Delphi 3. 0 中访问数据库的方通过ODBC访问,式有三种:直接访问,如访问Paradox 和DBase 数据库:如访问通过内嵌(Native)方式访问数据库,如访Access、Foxpro 等数据库:问SQL Server、Oracle、DB2等。

在Delphi 中,可以使用Table 控件或/和Quer y控件来访问数据库,二者的设置和用法部差不多,因此下面仅Table 控件为例说明这三种方式的特点和用法。

1. 直接访问Delphi 可以直接访问Paradox 和IDBase 这两个桌面型的数据库系统。

访问这两种类型的数据库时不需要特别的设置,只需要把文件路径赋给Table 控件的属性DatabaseName 就可以访问该路径下的数据库了。

当然,也可以事先建立映射数据库路径的数据库别名,然后把Table 控件的DatabaseName 属性设置为相应的数据库别名。

2. 通过ODBC访问访问Paradox 和DBase 以外的数据库,通常是通过ODBC来实现的。

Delphi 可以访问支持ODBC的数据库系统,如Access、SQL Server 和Oracle 等。

当然,通过ODBC 访问数据库时,首先要使用Window s的控制面板或Delphi 的数据库引擎(BDE) 建立ODBC 数据源。

在应用程序的控Delphi 提供了Database 控件,该控件的作用有:制下和数据库系统建立连接、进行事务处理等。

在数据库应用程序中,可以使用Database 控件,也可以不使用。

如果不使用Database 控件,可以直接把ODBC数据源的名称赋给Table 控件的属性DatabaseName 而达到访问该数据库的目的。

delphidll例子

delphidll例子

delphidll例子【篇一:delphidll例子】为了让人能快速的理解静态调用、动态调用,现在做一个函数封装在一个dll中,然后在application form里面调用这个函数,这个函数处理两个数的和。

用代码和图片说话:代码如下library project1;{ important note about dll memory management: sharemem must be thefirst unit in your librarys uses clause and your projects (select project-view source) uses clause if your dll exports any procedures orfunctions that pass strings as parameters or function results. thisapplies to all strings passed to and from your dll--even those thatare nested in records and classes. sharemem is the interface unit tothe borlndmm.dll shared memory manager, which must be deployed alongwith your dll. to avoid using borlndmm.dll, pass string informationusing pchar or shortstring parameters. }usessysutils,classes;function incc(a,b:integer):integer; stdcall; //真正的代码开始;beginresult :=a+b;end;{$r *.res}exports//允许调用;incc;end.按ctrl+f9编译以后会在文件夹下面会产生一个 project1.dll的dll文件。

DELPHI基础教程:动态链接库编程(一)[2]

DELPHI基础教程:动态链接库编程(一)[2]

DELPHI基础教程:动态链接库编程(一)[2]DLLs中的变量和段一个DLLs拥有自己的数据段(DS)因而它声明的任何变量都为自己所私有调用它的模块不能直接使用它定义的变量要使用必须通过过程或函数界面才能完成而对DLLs来说它永远都没有机会使用调用它的模块中声明的变量一个DLLs没有自己的堆栈段(SS)它使用调用它的应用程序的堆栈因此在DLL中的过程函数绝对不要假定DS = SS 一些语言在小模式编译下有这种假设但使用Delphi可以避免这种情况 Delphi绝不会产生假定DS = SS的代码 Delphi的任何运行时间库过程/函数也都不作这种假定需注意的是如果读者想嵌入汇编语言代码绝不要使SS 和DS登录同一个值DLLs中的运行时间错和处理由于DLLs无法控制应用程序的运行导致很难进行异常处理因此编写DLLs时要十分小心以确保被调用时能正常执行当DLLs中发生一个运行时间错时相应DLLs并不一定从内存中移去(因为此时其它应用程序可能正在用它)而调用DLLs的程序异常中止这样造成的问题是当DLLs已被修改重新进行调用时内存中保留的仍然可能是以前的版本修改后的程序并没有得到验证对于这个问题有以下两种解决方法在程序的异常处理部分显式将DLL卸出内存完全退出Windows 而后重新启动运行相应的程序同一般的应用程序相比 DLL中运行时间错的处理是很困难的而造成的后果也更为严重因此要求程序设计者在编写代码时要有充分周到的考虑库初始化代码的编写传统Windows中动态链接库的编写需要两个标准函数LibMain 和WEP 用于启动和关闭DLL 在LibMain中可以执行开锁DLL数据段分配内存初始化变量等初始化工作而WEP在从内存中移去DLLs前被调用一般用于进行必要的清理工作如释放内存等Delphi用自己特有的方式实现了这两个标准函数的功能这就是在工程文件中的begin…end部分添加初始化代码和传统Windows编程方法相比它的主要特色是初始化代码是可选的一些必要的工作(如开锁数据段)可以由系统自动完成所以大部分情况下用户不会涉及到可以设置多个退出过程退出时按顺序依次被调用LibMain和WEP对用户透明由系统自动调用初始化代码完成的主要工作是初始化变量分配全局内存块登录窗口对象等初始化工作在()节利用DLLs实现应用程序间的数据传输中用于数据共享的全局内存块就是在初始化代码中分配的设置DLLs退出时的执行过程Delphi有一个预定义变量ExitProc 用于指向退出过程的地址用户可以把自己的过程名赋给ExitProc 系统自动调用WEP函数把ExitProc指向的地址依次赋给WEP执行直到ExitProc为nil下边的一段程序包含一个退出过程和一段初始化代码用来说明如何正确设置退出过程library Test;{$S }uses WinTypes WinProcs;varSaveExit: Pointer;procedure LibExit; far;beginif ExitCode = wep_System_Exit thenbegin{ 系统关闭时的相应处理 }endelsebegin{ DLL卸出时的相应处理 }end;ExitProc := SaveExit; { 恢复原来的退出过程指针 }end;begin{DLL的初始化工作 }SaveExit := ExitProc; { 保存原来的退出过程指针 }ExitProc := @LibExit; { 安装新的退出过程 }end在初始化代码中首先把原来的退出过程指针保存到一个变量中而后再把新的退出过程地址赋给ExitProc 而在自定义退出过程LibExit结束时再把ExitProc的值恢复由于ExitProc是一个系统全局变量所以在结束时恢复原来的退出过程是必要的退出过程LibExit中使用了一个系统定义变量ExitCode 用于标志退出时的状态 ExitCode的取值与意义如下表 ExitCode的取值与意义━━━━━━━━━━━━━━━━━━━━━取值意义WEP_System_Exit Windows关闭WEP_Free_DLLx DLLs被卸出━━━━━━━━━━━━━━━━━━━━━退出过程编译时必须关闭stack_checking 因而需设置编译指示{$S }编写一般DLLs的应用举例在下面的程序中我们把一个字符串操作的函数储存到一个DLLs中以便需要的时候调用它应该注意的一点是为了保证这个函数可以被其它语言编写的程序所调用作为参数传递的字符串应该是无结束符的字符数组类型(即PChar类型)而不是Object Pascal的带结束符的Srting类型程序清单如下library Example;usesSysUtilsClasses;{返回字符在字符串中的位置}function InStr(SourceStr: PChar;Ch: Char) Integer; export;varLen i: Integer;beginLen := strlen(SourceStr)for i := to Len doif SourceStr[i] = ch thenbeginResult := i;Exit;end;Result := ;end;exportsInstr Index name MyInStr resident;beginend调用DLLs有两种方法可用于调用一个储存在DLLs中的过程lishixinzhi/Article/program/Delphi/201311/25208。

delphi 11动态链接库

delphi 11动态链接库

第11章 动态链接库本章讨论了Win32动态链接库,也就是DLL。

动态链接库(Dynamic Link Library,简称DLL)是一些编译过的可执行代码模块,后缀名为. DLL,可以在应用程序中或其它DLL中被调用。

在Windows环境中,DLL可以实现多个应用程序共享代码和资源。

DLL的用途非常广泛,是Windows程序设计中的一个非常重要的组成部分。

本章将从DLL的一些基础知识讲起,说明如何在Delphi开发环境中创建和使用DLL。

11.1 概述11.1.1 DLL的概念在开始介绍DLL的概念之前,先介绍一些有关DLL的一些术语如下:¾应用程序,一个扩展名为.exe的Windows程序。

¾可执行文件,一个包含可执行代码的文件,它包括.dll文件和.exe文件。

¾实例,当提到应用程序和DLL时,在内存中出现的可执行文件就是实例。

Win32系统通过实例句柄的方式来引用实例。

例如,如果一个应用程序运行两次,就会有应用程序的两个实例,同时就有两个实例句柄。

当一个DLL被调入时,实例及其相应的实例句柄同时产生。

应该注意的是,这里所提的实例与类的实例不能混淆。

¾模块,在32位Windows系统中,模块和实例可以说是同义的。

而在16位的Windows 系统中,是建立一个模块数据库来管理模块的,一个模块对应一个模块句柄。

在Win32中,应用程序的每一个实例都拥有自己的地址空间;所以,没有必要为模块单独指定标识符。

不过,微软仍然保留了它自己的术语。

注意一点,模块和实例是同一个概念。

¾任务,Windows是一个多任务(或任务切换)环境,所以它必须能够为运行的多个实例合理分配系统资源和时间。

于是,Windows建立一个任务数据库,这个数据库包括任务的实例句柄和其它必要信息,以此实现任务切换功能。

任务是Windows用来管理和分配资源与时间段的重要元素。

动态链接库是程序模块,它包括代码、数据或资源,能够被其它的Windows应用程序共享。

用Delphi编写及调用DLL的方法和技巧

用Delphi编写及调用DLL的方法和技巧

用Delphi编写及调用DLL的方法和技巧
蒋红龙
【期刊名称】《电脑开发与应用》
【年(卷),期】2003(016)012
【摘要】动态链接库是一种特殊的可执行文件,它是Microsoft Windows系列操作系统的一项新技术,阐述了动态链接库的基本概念及其优点,并举例讨论了用Delphi编写和调用DLL.的方法和技巧,由于DLL具有节省内存、共享代码、升级方便和独立于编程语言的优点,现已被广泛应用.
【总页数】3页(P22-24)
【作者】蒋红龙
【作者单位】大庆有限责任公司第四采油厂,大庆,163000
【正文语种】中文
【中图分类】TP3
【相关文献】
1.在C++Builder中编写和调用DLL [J], 黄明志
2.如何利用Delphi 4编写网上检索馆藏数据库的ISAPL DLL [J], 马林梓
3.使用Delphi编写DLL实现软件自动更新 [J], 云凤生
4.在VC中对Delphi所生成的DLLs的调用 [J], 李强;贾云霞
5.在Delphi中调用由VC++生成DLL的方法 [J], 赵福来;娄国焕
因版权原因,仅展示原文概要,查看原文内容请购买。

delphi调用c动态库

delphi调用c动态库

一、概述Delphi是Borland公司研制的高效的可视化开发工具,它既可用于开发系统软件,也适合于应用软件的开发。

随着韩国网络游戏《传奇》的红火,其开发工具delphi也被更多的软件开发人员所熟知;C语言也是目前IT界运用最广泛的开发语言之一。

最近由于工作方面的原因,需要提供delphi调用c/c++编写的动态库的例子。

在不同的开发语言之间相互调用,除了要熟练掌握各种语言的编写技巧之外,还要了解各种语言对函数的处理机制与调用规则。

本文讲述了delphi调用c 语言的动态库的例子,其中介绍了一些函数调用方面的基础知识,以及如何将c++中的结构、数组、字符串等数据类型转换为delphi中对应数据类型,还引入了常用的但网络上不常见的一些技术,比如回调函数的定义与注册,并通过实例展示了delphi调用c语言的动态库的细节,供大家在学习开发过程中参考。

开发工具:vc++6.0、delphi7.0二、基础知识2.1、回调函数软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。

其中回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。

回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。

同步调用是三者当中最简单的,而回调又常常是异步调用的基础。

回调函数与普通函数的申明并无区别,但如果是不同的开发语言之间通过回调函数来传递与处理数据,则一定要注意在不同语言对回调函数的申明与实现时其函数调用约定必须保持一致。

2.2、函数调用约定声明过程或函数时,可以指定调用约定(calling convention),尤其在以接口形式提供给其它语言工具使用时,则必须指定过程或函数的调用方式。

delphi dll 参数

Delphi DLL 参数1. 什么是 Delphi DLL?Delphi是一种基于Object Pascal语言的集成开发环境(IDE),是由Embarcadero Technologies开发的。

Delphi可用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序和移动应用程序。

Delphi中的DLL(动态链接库)是一种可重用的代码库,可以在不同的应用程序中共享和调用。

2. DLL 的优势使用DLL的主要优势在于代码重用和模块化开发。

通过将代码放入DLL中,我们可以将其用于多个应用程序中,避免重复编写相同的代码。

此外,DLL还提供了一种有效的方式来实现模块化开发,使得应用程序的开发和维护更加简单和可靠。

3. Delphi DLL 的参数在Delphi中,DLL的参数是指在调用DLL函数时传递给函数的值或引用。

参数可以是输入参数、输出参数或输入/输出参数。

下面是一些常见的DLL参数类型:•整数参数:在Delphi中,整数参数可以是Byte、ShortInt、Word、SmallInt、Cardinal、Integer等类型。

这些参数可以用于传递整数值,如计数器、索引等。

•浮点数参数:浮点数参数可以是Single、Double、Extended等类型。

这些参数用于传递浮点数值,如坐标、价格等。

•字符串参数:字符串参数可以是AnsiString、WideString、UnicodeString 等类型。

这些参数用于传递文本信息,如文件路径、用户名等。

•指针参数:指针参数用于传递内存地址,可以是PChar、PByte、PInteger 等类型。

通过指针参数,我们可以在DLL函数内部修改传入的参数值。

•数组参数:数组参数可以是静态数组或动态数组。

通过数组参数,我们可以传递一组相关的值,如图像像素、数据集等。

•记录参数:记录参数可以是自定义的记录类型。

通过记录参数,我们可以传递一组相关的字段值,如学生信息、订单详情等。

Delphi中资源文件的使用(静态,动态)

[转]Delphi中资源文件的使用在Delphi中,生成一个Appliction工程时,会默认生成一个与工程同名的资源文件,即使删除也会再度创建,但是这个资源文件中只有一个图标和一个版本信息。

通常情况下,我们还需要更多的多种多样的资源,虽然可以在IDE中载入并编译到EXE文件中去,但是有时我们需要将资源与EXE分开,以便生成多语言程序或将程序改为其它语言(如汉化)。

Delphi附带的ImageEdit可以编辑资源文件,但只能编辑位图、图标和光标,无法加入字符串资源,而且只持256色的图像。

为了将更多种类的资源,只有编写资源脚本或者使用其它资源编辑器,如Vis ual Stadio 6。

不过,Visual Stadio 6编辑的资源文件中包含了C++头文件定义,并且支持的具体资源类型较多,在Delphi中是无法识别的。

只好选择编写资源脚本了,资源脚本文件扩展名为.RC,可以用纯文本编辑器编写。

如下面是两个图标与两个字符串的脚本:COMPUTER RCDATA"computer.ico" /* Delphi中只支持RCDATA类型*/WINDOWSXP RCDATA"XP.ico"STRINGTABLEBEGIN1 "computer(电脑)"2 "Windows XP"END将其保存为MyRes.rc,需要注意的是,这里包含了两个图标,注意文件名及路径(这里是与文件同一目录)。

在命令提示符窗口中将目录切换到MyRes.rc所在的路径,运行brcc32 MyRes.rc,其中brcc 32.exe是Delphi附带的资源编译工具。

如果想将资源文件生成其中扩展名的文件(如.DLL),可以增加-fo参数,如:brcc32 MyRes.rc –of MyRes.dll。

接下来是对资源的引用,引用方法有静态与动态两种,静态引用就是将资源文件包含到源码中编译到EXE中去;动态引用则是把资源文件当成DLL动态装载。

DELPHI中调用DLL知识

Delphi环境中编写调用DLL的方法和技巧提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维护升级的重要保证。

(举个例子,笔者的Win95 System目录下尽有500多个DLL文件。

)其实,DLL是一种特殊的可执行文件。

说它特殊主要是因为一般它都不能直接运行,需要宿主程序比如*.EXE程序或其他DLL的动态调用才能够使用。

简单的说,在通常情况下DLL是经过编译的函数和过程的集合。

使用DLL技术主要有以下几个原因:一、减小可执行文件大小。

DLL技术的产生有很大一部分原因是为了减小可执行文件的大小。

当操作系统进入Windows时代后,其大小已经达到几十兆乃至几百兆。

试想如果还是使用DOS时代的单执行文件体系的话一个可执行文件的大小可能将达到数十兆,这是大家都不能接受的。

解决的方法就是采用动态链接技术将一个大的可执行文件分割成许多小的可执行程序。

二、实现资源共享。

这里指的资源共享包括很多方面,最多的是内存共享、代码共享等等。

早期的程序员经常碰到这样的事情,在不同的编程任务中编写同样的代码。

这种方法显然浪费了很多时间,为了解决这个问题人们编写了各种各样的库。

但由于编程语言和环境的不同这些库一般都不能通用,而且用户在运行程序时还需要这些库才行,极不方便。

DLL的出现就像制定了一个标准一样,使这些库有了统一的规范。

这样一来,用不同编程语言的程序员可以方便的使用用别的编程语言编写的DLL。

另外,DLL还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,而且可以同时为多个进程服务。

三、便于维护和升级。

细心的朋友可能发现有一些DLL文件是有版本说明的。

(查看DLL文件的属性可以看到,但不是每一个DLL文件都有)这是为了便于维护和升级。

举个例子吧,早期的Win95中有一个BUG那就是在闰年不能正确显示2月29日这一天。

后来,Microsoft发布了一个补丁程序纠正了这个BUG。

Delphi动态与静态调用DLL(最好的资料)

Delphi动态与静态调用DLL(最好的资料)摘要:本文阐述了 Windows 环境下动态链接库的概念和特点,对静态调用和动态调用两种调用方式作出了比较,并给出了 Delphi 中应用动态链接库的实例。

一、动态链接库的概念动态链接库( Dynamic Link Library ,缩写为 DLL )是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。

动态链接库文件的扩展名一般是 dll ,也有可能是 drv 、 sys 和 fon ,它和可执行文件( exe )非常类似,区别在于 DLL 中虽然包含了可执行代码却不能单独执行,而应由 Windows 应用程序直接或间接调用。

动态链接是相对于静态链接而言的。

所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

换句话说,函数和过程的代码就在程序的 exe 文件中,该文件包含了运行时所需的全部代码。

当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。

而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。

仅当应用程序被装入内存开始运行时,在 Windows 的管理下,才在应用程序与相应的 DLL 之间建立链接关系。

当要执行所调用 DLL 中的函数时,根据链接产生的重定位信息, Windows 才转去执行 DLL 中相应的函数代码。

一般情况下,如果一个应用程序使用了动态链接库, Win32 系统保证内存中只有 DLL 的一份复制品,这是通过内存映射文件实现的。

DLL 首先被调入 Win32 系统的全局堆栈,然后映射到调用这个 DLL 的进程地址空间。

在 Win32 系统中,每个进程拥有自己的 32 位线性地址空间,如果一个 DLL 被多个进程调用,每个进程都会收到该 DLL 的一份映像。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Delphi中动态链接库两种调用方式的比较发布时间:2006.04.10 01:19来源:赛迪网社区作者:same
一、动态链接库的概念
动态链接库(Dynamic Link Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。

动态链接库文件的扩展名一般是dll,也有可能是drv、sys和fon,它和可执行文件(exe)非常类似,区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。

动态链接是相对于静态链接而言的。

所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。

换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。

当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。

而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。

仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。

当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。

一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL 的一份复制品,这是通过内存映射文件实现的。

DLL首先被调入Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。

在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映像。

与16位Windows不同,在Win32中DLL可以看作是每个进程自己的代码。

二、动态链接库的优点
1.共享代码、资源和数据
使用DLL的主要目的就是为了共享代码,DLL的代码可以被所有的Windows应用程序共享。

2.隐藏实现的细节
DLL中的例程可以被应用程序访问,而应用程序并不知道这些例程的细节。

3.拓展开发工具如Delphi的功能
由于DLL是与语言无关的,因此可以创建一个DLL,被C++、VB或任何支持动态链接库的语言调用。

这样如果一种语言存在不足,就可以通过访问另一种语言创建的DLL 来弥补。

三、动态链接库的实现方法
1. Load-time Dynamic Linking
这种用法的前提是在编译之前已经明确知道要调用DLL中的哪几个函数,编译时在目标文件中只保留必要的链接信息,而不含DLL函数的代码;当程序执行时,利用链接信息加载DLL函数代码并在内存中将其链接入调用程序的执行空间中,其主要目的是便于代码共享。

2. Run-time Dynamic Linking
这种方式是指在编译之前并不知道将会调用哪些DLL函数,完全是在运行过程中根据需要决定应调用哪个函数,并用LoadLibrary和GetProcAddress动态获得DLL函数的入口地址。

四、DLL的两种调用方式在Delphi中的比较
编写DLL的目的是为了输出例程供其他程序调用,因此在DLL的工程文件中要把输
出的例程用Exports关键字引出。

在调用DLL的应用程序中,需要声明用到的DLL中的方法,声明格式要和DLL中的声明一样。

访问DLL中的例程有静态调用和动态调用两种方式。

静态调用方式就是在单元的Interface部分用External指示字列出要从DLL中引入的例程;动态调用方式就是通过调用Windows的API包括LoadLibrary函数、GetProcAddress函数以及FreeLibrary函数动态的引入DLL中的例程。

静态调用方式所需的代码较动态调用方式所需的少,但存在着一些不足,一是如果要加载的DLL不存在或者DLL中没有要引入的例程,这时候程序就自动终止运行;二是DLL一旦加载就一直驻留在应用程序的地址空间,即使DLL已不再需要了。

动态调用方式就可解决以上问题,它在需要用到DLL的时候才通过LoadLibrary函数引入,用完后通过FreeLibrary函数从内存中卸载,而且通过调GetProcAddress函数可以指定不同的例程。

最重要的是,如果指定的DLL出错,至多是API调用失败,不会导致程序终止。

以下将通过具体的实例说明说明这调用方式的使用方法。

1.静态调用方式
示例程序创建了一个DLL,其中仅包含一个求两个整数的和的函数,在主程序中输入两个整数,通过调用该DLL,即可求出两个整数的和。

该DLL的程序代码如下:
library AddNum;
uses
SysUtils,
Classes;
{$R *.res}
function
AddNumber(Num1,Num2:integer):integer;stdcall; //定
义求和函数
begin
result:=Num1+Num2;
end;
exports
AddNumber; //引出求和函数
begin
end.
procedure TForm1.Button1Click(Sender: TObject);
var
Number1,Number2:integer;
Sum:integer;
begin
Number1:=strtoint(Edit1.Text);
Number2:=strtoint(Edit2.Text);
Sum:=AddNum(Number1,Number2); //调用求和函数计算
结果
Edit3.Text:=inttostr(Sum);
end;
2.动态调用方式
这个示例程序创建了一个显示日期的DLL,其中包含一个窗体。

程序中定义了一个ShowCalendar函数,返回在这个窗体中设定的日期。

函数定义如下:
function ShowCalendar(AHandle: THandle; ACaption:
String): TDateTime;
var
DLLForm: TDLLForm;
begin
Application.Handle := AHandle;
DLLForm := TDLLForm.Create(Application); //创建
并显示窗体
try
DLLForm.Caption := ACaption;
DLLForm.ShowModal; //显示方式为模式化
Result := DLLForm.calDLLCalendar.CalendarDate;
//返回设定日期
finally
DLLForm.Free; //用完后卸载该窗体
end;
end;
在DLL的工程文件中用exports ShowCalendar; 语句引出该函数。

下面通过一个简单的应用程序测试一下该DLL文件。

新建一个工程文件,在窗体中放置一个Label控件和一个按钮控件,在按钮控件的OnClick事件中编写如下代码:
procedure TMainForm.Button1Click(Sender: TObject);
var
OneHandle : THandle; //定义一个句柄变量
begin
OneHandle := LoadLibrary('Clendar.dll'); //动态
载入DLL,并返回其句柄
try
if OneHandle <> 0 then //如果载入成功则获取
ShowCalendar函数的地址
@ShowCalendar := GetProcAddress(OneHandle,
'ShowCalendar');
if not (@ShowCalendar = nil) then
//如果找到该函数则在主窗体的Label1中显示
DLL窗体中设定的日期
Label1.Caption :=
DateToStr(ShowCalendar(Application.Handle,
Caption))
else
RaiseLastWin32Error;
finally
FreeLibrary(OneHandle); //调用完毕收回DLL占用
的资源
end;
end;
从以上程序中可以看到DLL的动态调用方式比静态调用方式的优越之处。

DLL例程在用到时才被调入,用完后就被卸载,大大减少了系统资源的占用。

在调用LoadLibrary 函数时可以明确指定DLL的完整路径,如果没有指定路径,运行时首先查找应用程序载入的目录,然后是Windows系统的System目录和环境变量Path设定的路径。

五、结束语
由于动态链接库可以实现代码和资源的共享,大大减少系统资源的占用,因此在当今的应用程序开发中起着非常重要的作用。

Delphi是现今流行的应用软件开发工具,本文就如何在Delphi中使用动态链接库给出了一定程度上的阐述。

相关文档
最新文档