【vfp开源代码栏目提醒】:网学会员鉴于大家对vfp开源代码十分关注,论文会员在此为大家搜集整理了“Delphi中动态链接库两种调用方式的比较 PDF - 技术总结”一文,供大家参考学习
Delphi中动态链接库两种调用方式的比较.txt曾经拥有的不要忘记不能得到的更要珍惜属于自己的不要放弃已经失去的留作回忆。
Delphi开发 Delphi中动态链接库两种调用方式的比较 语言 o Java
开源 o PHP
开源 o .Net
开源 o C
开源 o
开源社区 o 开发语言 o 数据库开发 o 移动/游戏开发 分类: o 开发语言 VB开发 VC开发
VFP开发 Delphi开发 Power Builder C Builder C/C 汇编 ASP.NET C VB.NET VC.NET VS.NET ADO.NET Framework Web Service Remoting .NET XM J2EE J2SE EJB J2ME Servlet/JSP Applet/Swing Struts/Hibernate ASP开发 PHP开发 CGI开发 Perl开发 XML开发 JavaScript VBScript Web服务器 链接 o Hello
开源 o Microsoft .NET o SourceForge o Aapche o Dougal o Google Code Search o Sun Java o php.net o Donncha o Alex Search Meta: o RSS o Comments RSS o Valid XHTML 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的一份映像。
与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 AddNumberNum1Num2:integer:integerstdcall //定义求和函数 begin result:Num1Num2 end exports AddNumber //引出求和函数 begin end. 主程序在调用该DLL时首先在interface部分声明要调用的函数 function AddNumNum1Num2:integer:integerstdcallexternal AddNum.dll name AddNumber 然后在按钮控件的事件中写入如下
代码 procedure TForm1.Button1ClickSender: TObject var Number1Number2:integer Sum:integer begin Number1:strtointEdit1.Text Number2:strtointEdit2.Text Sum:AddNumNumber1Number2 //调用求和函数计算结果 Edit3.Text:inttostrSum end 2动态调用方式 这个示例程序创建了一个显示日期的DLL其中包含一个窗体。
程序中定义了一个ShowCalendar函数返回在这个窗体中设定的日期。
函数定义如下 function ShowCalendarAHandle: THandle ACaption: String: TDateTime var DLLForm: TDLLForm begin Application.Handle : AHandle DLLForm : TDLLForm.CreateApplication //创建并显示窗体 try DLLForm.Caption : ACaption DLLForm.ShowModal //显示方式为模式化 Result : DLLForm.calDLLCalendar.CalendarDate //返回设定日期 finally DLLForm.Free //用完后卸载该窗体 end end 在DLL的工程文件中用exports ShowCalendar 语句引出该函数。
下面通过一个简单的应用程序测试一下该DLL文件。
新建一个工程文件在窗体中放置一个Label控件和一个按钮控件在按钮控件的OnClick事件中编写如下
代码 procedure TMainForm.Button1ClickSender: TObject var OneHandle : THandle //定义一个句柄变量 begin OneHandle : LoadLibraryClendar.dll //动态载入DLL并返回其句柄 try if OneHandle 0 then //如果载入成功则获取ShowCalendar函数的地址 ShowCalendar : GetProcAddressOneHandle ShowCalendar if not ShowCalendar nil then //如果找到该函数则在主窗体的Label1中显示DLL窗体中设定的日期 Label1.Caption : DateToStrShowCalendarApplication.Handle Caption else RaiseLastWin32Error finally FreeLibraryOneHandle //调用完毕收回DLL占用的资源 end end 从以上程序中可以看到DLL的动态调用方式比静态调用方式的优越之处。
DLL例程在用到时才被调入用完后就被卸载大大减少了系统资源的占用。
在调用LoadLibrary函数时可以明确指定DLL的完整路径如果没有指定路径运行时首先查找应用程序载入的目录然后是Windows系统的System目录和环境变量Path设定的路径。
五、结束语 由于动态链接库可以实现
代码和资源的共享大大减少系统资源的占用因此在当今的应用程序开发中起着非常重要的作用。
Delphi是现今流行的应用软件开发工具本文就如何在Delphi中使用动态链接库给出了一定程度上的阐述。
上一篇:
Cortex A9/A8/Arm11/Arm9 性能测试PK
下一篇:
关于大学英语教学