我和DELPHI不得不说的故事之-------DLL文件
2010-01-16 09:43
162 查看
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实验室” 博客,转载请与作者联系!
言归正传,还是赶紧把今天的学习内容总结一下。为了更高效的使用内存及提高各个程序间的兼容性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实验室” 博客,转载请与作者联系!
相关文章推荐
- 我和DELPHI不得不说的故事之-------数据库locate、gotokey查询(上)
- 我和DELPHI不得不说的故事之-------文件
- 我和DELPHI不得不说的故事之-------数据库(上)
- 我和DELPHI不得不说的故事之-------终于在半独立的状态下完成了第一个程序
- 我和DELPHI不得不说的故事之------句柄
- Delphi写dll文件
- 一个全世界最珍贵的故事——职场人不得不看(转)
- Delphi 指定Dll文件的扩展名
- Java和微软不得不说的故事
- dp和px,那些不得不吐槽的故事——Android平台图
- Cocos2dx 3.0 过渡篇(七)EditBox和ControlSlider不得不说的故事
- Java与Android不得不说的故事 --摘自网友博客20160302
- 2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp
- int,float,double之间不得不说的故事
- Java与微信不得不说的故事——实现图文消息的发送
- dp和px,那些不得不吐槽的故事——Android平台图片文字元素单位浅析
- 《我与Android不得不说的故事-1-立贴明志》
- IP地址与UInt之间不得不说的故事
- setRequestedOrientation&onCreate不得不说的故事
- 和尚与尼姑雨中相遇后不得不说的故事 4