以下是我对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.
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.
解决方案 »
- 一维转二维,导出EXCEL
- 请教如何得到图像(tif)的页数
- 如何在读写大文件时(一般容量在300M 以上)中断它的操作!
- vc编写的dll如何调用
- 有谁看过这个报错?
- 如何用shellexecute打开一个网址
- 利用字段的AsString取出的值为什么不能超过255个字节?100分。
- 急!在运行期间,对于LISTBOX,如何动态的指定特定的ITEM为当前的ITEM?currentitem:=ListBox1.ItemIndex;ListBox1.Items.Move(currentitem,c
- 寻找合作伙伴,定制一个触摸屏的点菜软件!!! 一起赚钱啦
- delphi中类的相互访问的问题??
- 如何实现NT服务程序可视化
- 些题超难!如何清除EXE文件中无用的资源
2. 频繁调用的dll使用静态调用方式,不频繁的情况下使用动态调用方式
3. 静态调用的dll如果不在程序中地址的目录,exe同级目录,windows的Path路径中指定的路径中,则程序不能正常启动,提示加载*.dll失败,动态调用只在调用时才查找
lz讲静态调用使用完DLL后并不会清空内存,而是继续驻留,那么这里最后又谁释放?
--系统?/程序员自己释放?也就是说静态调用的dll在什么时候释放?