



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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;usesSysUtils,Classes;$R *.resfunction AddNumber(Num1,Num2:integer):integer;stdcall; /定义求和函数beginresult:=Num1+Num2;end;exportsAddNumber; /引出求和函数beginend.主程序在调用该DLL时,首先在interface部分声明要调用的函数: function AddNum(Num1,Num2:integer):integer;stdcall;external AddNum.dllname AddNumber;然后在按钮控件的事件中写入如下代码: procedure TForm1.Button1Click(Sender: TObject);varNumber1,Number2:integer; Sum:integer;beginNumber1:=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;varDLLForm: TDLLForm;beginApplication.Handle := AHandle;DLLForm := TDLLForm.Create(Application); /创建并显示窗体tryDLLForm.Caption := ACaption;DLLForm.ShowModal; /显示方式为模式化Result := DLLForm.calDLLCalendar.CalendarDate; /返回设定日期finallyDLLForm.Free; /用完后卸载该窗体end;end;在DLL的工程文件中用exports ShowCalendar; 语句引出该函数。下面通过一个简单的应用程序测试一下该DLL文件。新建一个工程文件,在窗体中放置一个Label控件和一个按钮控件,在按钮控件的OnClick事件中编写如下代码: procedure TMainForm.Button1Click(Sender: TObject);varOneHandle : THandle; /定义一个句柄变量beginOneHandle := LoadLibrary(Clendar.dll); /动态载入DLL,并返回其句柄tryif OneHandle 0 then /如果载入成功则获取ShowCalendar函数的地址ShowCalendar := GetProcAddress(OneHandle, ShowCalendar);if not (ShowCalendar = nil) then/如果找到该函数则在主窗体的Label1中显示DLL窗体中设定的日期Label1.Caption := DateToStr(ShowCalendar(Application.Handle, Caption)elseRaiseLastWin32Error;finallyFreeLibrary(OneHandle); /调用完毕收回DLL占用的资源end;end;从以上程序中可以看到DLL的动态调用方式比静态调用方式的优越之处。DLL例程在用到时才被调入,用完后就被卸载,大大减少了系统资源的占用。在调用LoadLibrary函数时可以明确指定DL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《金融服务营销》 测试题及答案B
- 工业园区绿色发展路径探索
- 工业智能化新材料与物联网的结合
- 工业安全与智能制造成型技术
- 工业控制系统安全技术研究报告
- 工业技术改造项目申报政策分析
- 工业机器人技术的创新与应用研究
- 工业自动化中的智能硬件产品解决方案
- 工业设计中的智能制造成型技术应用探讨
- 工业自动化与智能制造的发展趋势
- 2024年杭州市萧山区机关事业单位招聘真题
- 北京经济技术开发区教育领域招聘聘任制教师笔试真题2024
- 2025高考英语解析及其范文
- 2025年6月8日北京市事业单位面试真题及答案解析(下午卷)
- 四川省眉山市东坡区苏辙中学2025年七下英语期末质量跟踪监视试题含答案
- 房屋市政工程生产安全重大事故隐患判定标准(2024版)培训课件
- 国家开放大学《中国法律史》形考任务1-3答案
- “职业健康达人”竞赛考试题库500题(含答案)
- 压力容器使用年度检查报告(范本)
- 关于德国能源转型的十二个见解
- 内蒙古自治区公路工程施工企业信用评价管理实施细则
评论
0/150
提交评论