动态链接库
大家在使用window操作系统、各种成品软件以及软件开发的过程中,经常会遇到.DLL的文件,这种文件不能被直接执行和打开,但是确是操作系统和其他软件必不可少的组成部分,.DLL是什么?它是怎么生成的?在系统的运行中起了哪些作用?如何使用DLL?在技术高速发展的年代它还能走多远?
DLL是什么?
动态链接库(Dynamic Link Library,缩写为DLL)通常是以.DLL为后缀的文件,也可能是以drv、sys、fon结尾,它是一种特殊的可执行文件,其特殊性在于它不能被直接运行,需要宿主程序或其他DLL的动态调用才能够使用。在通常情况下,DLL是经过编译的函数和过程的集合。
动态链接库是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。应该由window应用程序直接或间接调用。
为什么要使用动态链接库?
减小可执行文件的大小
DLL技术产生的很大原因是减小可执行文件的大小,当操作系统进入window时代后,
其大小已经达到了几十兆乃至几百兆,在单执行文件体系的DOS时代,一个可执行文件达到几十兆,这是不可以被接受的。解决的方法就是采用动态链接技术将一个大的可执行文件分割成小的可执行程序。
实现资源共享
这里的资源共享主要指的是内存共享和代码共享,早期的程序员在开发的时候会花费很
多时间在不同的编程任务中写相同的代码,这种方法显然浪费了很多时间,为了解决这个问题,人们编写了各种各样的库。由于编程语言和环境的不同,这些库往往不能通用,DLL的出现就像制定了一个标准一样,使这些库有了统一的规范。DLL还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,并且可以为多个进程服务。
便于维护和升级
标准的DLL是有版本说明的,这是为了便于维护和升级,在我们升级操作
系统或者驱动程序的时候通常都是对DLL进行升级。而且在我们试图安装较低版本的DLL时,系统会给我们提示或警告,避免人为的操作错误。
本三院校比较安全
DLL文件遭受病毒侵害的几率比EXE文件低得多,反汇编也更加困难。
如何生成动态库?
上面说过,动态链接库也是一种可执行文件,是编译过的函数和过程的集合,DLL也可以由各种编程语言编写。下面以Delphi为例:
新建一个Activex Library项目,
Library DelphiDLLTest;
Uses;
Sysutils,classes;
Function TestDll(i:integer):integer;stdcall;
Begin
Result I;
End;
Exports
TestDll;
Begin
End.
实际上编写动态库和编写其他程序基本是相同的,只是在testdll函数后面多了一个stdcall参数,并且用exports语句申明了testdll函数。Exports语句即申明了testdll函数为外部函数,这样做可以使该函数在外部就能看到,如果不这样声明,函数将不能被调用。需要强调一点的是,在使用delphi编写动态库的时候,应该避免使用string类型,尽量string类型的参数、变量声明为Pchar或shortstring (如s:string[10])类型。appleid申请
如何使用DLL?
调用一个动态库比写一个动态库要容易些,调用方式有静态调用和动态调用两种,先介绍一下静态调用,所谓的静态链接就是把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。我们还是使用Delphi来举例:Unit unit1;
Interface
Uses
Windows,message,sysutils,classes,graphics,controls,forms,dialogs,stdcalls;
Type
Tform1=class(tform)
Edit1:teidt;
Button1:tbutton;
Procudure button1click(sender:tobject);
2012年清明节是几月几日Private
{private declarations}
Public
{public declarations}
End;
Var
Form1:tform1;
Implementation
{$R*.DFM}
Function TestDll(I:integer):integer;stdcall
External‘delphi.dll’
建党100周年美句Procedure tform1.button1click(sender:tobject);
Begin
<:=inttostr(testdll(1));
End;
需要强调的是在调用的时候也必须要使用stdcall参数,用external语句指定被调用的dll文件的路径和名称。DLL中的全局变量在调用DLL的程序中是不能直接调用的。
动态调用dll相对复杂很多,但非常灵活,下面是使用c++编写的DLL:
#include
Extern“C”_declspec(dllexport)
Int winapi testC(int i)
ab型血人的性格{
Return I;
}
编译之后生成一个DLL,我们命名为cpp.dll,下面是Delphi动态调用dll的方法:Procedure tform1.button1click(sender:tobject);
Type
Tintfunc=function(i:integer):integer;stdcall;
立春的说说Var
Th:thandle;
Tf:tintfunc;
Tp:tforproc;
Begin
Th:=loadlibrary(‘CPP.DLL’);
If th>0then
Try
Tp:=getprocaddress(th,pchar(‘testc’));
If tp<>nil then
Begin
Tf:=tintfunc(tp);
<:=inttostr(tf(1));
End;
Else
Showmessage(‘TESTC函数没有到’);
Fanally
Freelibrary(th);
End
Else
Showmessage(‘CPP.dll没有到’);
End;
使用DLL的其他技巧
为了保证DLL的正确性,可以先编写成普通的应用程序的一部分,调试正确后再从主程序中分离出来;
为了保证DLL的通用性,应该杜绝在自己编写的DLL中出现可视化空间和自定义非windows定义的类型;
每个函数和过程应该尽量短小精悍,并配合相关注释。
应多利用try、finally来处理可能出现的异常或错误,要引用sysutils
尽量减少引用单元以控制dll的大小,如dialogs
把自己编写的DLL放在system32下面也可以不用指定具体路径,不过应该在使用不熟练的情况下避免这样做。
DLL在编写时是不能运行和单步调试的,不过有一个方法,就是在RUN|parameter菜单中设置一个宿
主程序。在Local页的HOST APPLICATION中添加宿主程序的名字就可以单步调试、断点观察和运行了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论