大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> Delphi中动态链接库两种调用方式的比较

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

时间: 2021-07-31 作者:daque

纲要:正文阐明了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的一份映像。与16位windows各别,在win3第22中学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,即可求出两个平头的和,如图1所示。图1 dll的静态挪用  该dll的步调代码如次:library addnum;usessysutils,classes;{$r *.res}function addnumber(num1,num2:integer):integer;stdcall; //设置乞降因变量 begin  result:=num1+num2; end;  exports  addnumber; //引出乞降因变量 beginend.   主步调在挪用该dll时,开始在interface局部证明要挪用的因变量:function addnum(num1,num2:integer):integer;stdcall;external 'addnum.dll'name 'addnumber';   而后在按钮控件的事变中写入如次代码: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,个中包括一个窗体,如图2所示。图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    //即使找到该因变量则在主窗体的label第11中学表露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中运用动静链接库给出了确定水平上的阐明。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.