我和DELPHI不得不说的故事之-------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.

本文出自 “中国CHS实验室” 博客,转载请与作者联系!

你可能感兴趣的:(职场,休闲)