以下是我对DLL文件的总结有不对之处请大家多多指教DLL文件可以说是最熟悉的陌生人了,记得刚开始接触电脑的时候就知道WINDOWS里有这么一种文件中文名叫‘点DLL动态链接库’。名字比较饶口,当然也不知道它到底是什么东东。没想到在对DELPHI进行学习的过程中竟然找到了答案,而且我还知道了除了DLL外MS中的drv .sys .fon 全部都属于DLL的范畴!看来DELPHI又给我补课了,呵呵!  言归正传,还是赶紧把今天的学习内容总结一下。为了更高效的使用内存及提高各个程序间的兼容性DLL文件应运而生,它主要的作用就是把所有经常使用的函数、过程或资源等等打包起来,当有程序使用时再调用,而且多个程序可以共享使用但是内存中却只有一个副本运行,比起来传统的调用方法要高效的多。DELPHI中DLL文件的调用分为两种:静态和动态调用,下面分别总结一下它们的区别。  静态调用:  须要在interface中声明要调用的函数及DLL文件如下  function pin(s:double):double;stdcall;external 'C:\Program Files\Borland\Delphi7\Projects\jiao.dll';        external(直译为外部): external  'DLL路径文件名'   stdcall(直译为标准调用):标准调用也是WINDOWS中的调用方式,这种方式是兼容性最好的        上面的代码也是泾渭分明,前半部分为DLL文件中exports(直译为导出)中列出的函数,在这里又把该函数原方不动的写了一遍。后半部分的作用在于调用DLL文件,并设置调用的方式(这里是标准调用);  缺点:使用完DLL后并不会清空内存,而是继续驻留,效率不高.       动态调用:  动态调用真正做到了‘想要就要’。实现这个想法的不是DELPHI了,而是WIN32的API函数。这里要到的是3个函数:loadlibrary、getprocaddress、freelibrary,这3个函数分工明确:得到DLL路径句柄、获得DLL中须要调用的地址、释放内存。以下是具体的用法type
tsun=function(d:integer):integer;stdcall; //函数类型 ,这里必须有否则不能调用函数,因为GET返回的是地址procedure TForm1.Button1Click(Sender: TObject);
var
 hd:thandle; //定义一个句柄和地址变量
 get:tfarproc;
begin
 hd:=loadlibrary('C:\Program Files\Borland\Delphi7\Projects\sundll.dll'); //得到DLL文件的句柄
 showmessage(pchar(hd));
 if hd>32 then
 begin
 get:=getprocaddress(hd,'sun'); //得到DLL文件中SUN函数的地址
 showmessage(pchar(get));
 edit2.Text:=inttostr(tsun(get)(strtoint(edit1.Text)));
 end;
 freelibrary(hd);         DLL文件的书写规范 DELPHI中似乎并没有太多的要求,写DLL和在单元中的规范基本上一样,不过有几个小地方得注意下library jiao; //DLL名uses
  SysUtils,
  Classes;{$R *.res}
function pin(s:double):double; stdcall; //函数,STDCALL是标准调用
begin
      result:=s*s;
end;
exports //直译为输出,意思是DLL文件须要被外部程序调用的就在其后列表
   pin;
begin //和单元中不一样的是此处一般不用写入内容
end.
  

解决方案 »

  1.   

    1. 一般情况下静态调用比动态调用速度快
    2. 频繁调用的dll使用静态调用方式,不频繁的情况下使用动态调用方式
    3. 静态调用的dll如果不在程序中地址的目录,exe同级目录,windows的Path路径中指定的路径中,则程序不能正常启动,提示加载*.dll失败,动态调用只在调用时才查找
      

  2.   

    最近在用dll封装窗体,看了有一问:
       lz讲静态调用使用完DLL后并不会清空内存,而是继续驻留,那么这里最后又谁释放?
      --系统?/程序员自己释放?也就是说静态调用的dll在什么时候释放?
      

  3.   

    操作系统管理在操作系统上运行的软件和硬件资源。打开动态库时需要想操作系统请求资源,操作系统分配一个Handle给请求者,同时维护一个类似请求队列,所有的请求者都完成调用了,操作系统负责释放