您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > Delphi7动态链接库
动态链接库大家在使用window操作系统、各种成品软件以及软件开发的过程中,经常会遇到.DLL的文件,这种文件不能被直接执行和打开,但是确是操作系统和其他软件必不可少的组成部分,.DLL是什么?它是怎么生成的?在系统的运行中起了哪些作用?如何使用DLL?在技术高速发展的年代它还能走多远?DLL是什么?动态链接库(DynamicLinkLibrary,缩写为DLL)通常是以.DLL为后缀的文件,也可能是以drv、sys、fon结尾,它是一种特殊的可执行文件,其特殊性在于它不能被直接运行,需要宿主程序或其他DLL的动态调用才能够使用。在通常情况下,DLL是经过编译的函数和过程的集合。动态链接库是一个可以被其他应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。应该由window应用程序直接或间接调用。为什么要使用动态链接库?减小可执行文件的大小DLL技术产生的很大原因是减小可执行文件的大小,当操作系统进入window时代后,其大小已经达到了几十兆乃至几百兆,在单执行文件体系的DOS时代,一个可执行文件达到几十兆,这是不可以被接受的。解决的方法就是采用动态链接技术将一个大的可执行文件分割成小的可执行程序。实现资源共享这里的资源共享主要指的是内存共享和代码共享,早期的程序员在开发的时候会花费很多时间在不同的编程任务中写相同的代码,这种方法显然浪费了很多时间,为了解决这个问题,人们编写了各种各样的库。由于编程语言和环境的不同,这些库往往不能通用,DLL的出现就像制定了一个标准一样,使这些库有了统一的规范。DLL还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,并且可以为多个进程服务。便于维护和升级标准的DLL是有版本说明的,这是为了便于维护和升级,在我们升级操作系统或者驱动程序的时候通常都是对DLL进行升级。而且在我们试图安装较低版本的DLL时,系统会给我们提示或警告,避免人为的操作错误。比较安全DLL文件遭受病毒侵害的几率比EXE文件低得多,反汇编也更加困难。如何生成动态库?上面说过,动态链接库也是一种可执行文件,是编译过的函数和过程的集合,DLL也可以由各种编程语言编写。下面以Delphi为例:新建一个ActivexLibrary项目,LibraryDelphiDLLTest;Uses;Sysutils,classes;FunctionTestDll(i:integer):integer;stdcall;BeginResultI;End;ExportsTestDll;BeginEnd.实际上编写动态库和编写其他程序基本是相同的,只是在testdll函数后面多了一个stdcall参数,并且用exports语句申明了testdll函数。Exports语句即申明了testdll函数为外部函数,这样做可以使该函数在外部就能看到,如果不这样声明,函数将不能被调用。需要强调一点的是,在使用delphi编写动态库的时候,应该避免使用string类型,尽量string类型的参数、变量声明为Pchar或shortstring(如s:string[10])类型。如何使用DLL?调用一个动态库比写一个动态库要容易些,调用方式有静态调用和动态调用两种,先介绍一下静态调用,所谓的静态链接就是把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。我们还是使用Delphi来举例:Unitunit1;InterfaceUsesWindows,message,sysutils,classes,graphics,controls,forms,dialogs,stdcalls;TypeTform1=class(tform)Edit1:teidt;Button1:tbutton;Procudurebutton1click(sender:tobject);Private{privatedeclarations}Public{publicdeclarations}End;VarForm1:tform1;Implementation{$R*.DFM}FunctionTestDll(I:integer):integer;stdcallExternal‘delphi.dll’Proceduretform1.button1click(sender:tobject);BeginEdit1.text:=inttostr(testdll(1));End;需要强调的是在调用的时候也必须要使用stdcall参数,用external语句指定被调用的dll文件的路径和名称。DLL中的全局变量在调用DLL的程序中是不能直接调用的。动态调用dll相对复杂很多,但非常灵活,下面是使用c++编写的DLL:#includeExtern“C”_declspec(dllexport)IntwinapitestC(inti){ReturnI;}编译之后生成一个DLL,我们命名为cpp.dll,下面是Delphi动态调用dll的方法:Proceduretform1.button1click(sender:tobject);TypeTintfunc=function(i:integer):integer;stdcall;VarTh:thandle;Tf:tintfunc;Tp:tforproc;BeginTh:=loadlibrary(‘CPP.DLL’);Ifth0thenTryTp:=getprocaddress(th,pchar(‘testc’));IftpnilthenBeginTf:=tintfunc(tp);Edit1.text:=inttostr(tf(1));End;ElseShowmessage(‘TESTC函数没有找到’);FanallyFreelibrary(th);EndElseShowmessage(‘CPP.dll没有找到’);End;使用DLL的其他技巧为了保证DLL的正确性,可以先编写成普通的应用程序的一部分,调试正确后再从主程序中分离出来;为了保证DLL的通用性,应该杜绝在自己编写的DLL中出现可视化空间和自定义非windows定义的类型;每个函数和过程应该尽量短小精悍,并配合相关注释。应多利用try、finally来处理可能出现的异常或错误,要引用sysutils尽量减少引用单元以控制dll的大小,如dialogs把自己编写的DLL放在system32下面也可以不用指定具体路径,不过应该在使用不熟练的情况下避免这样做。DLL在编写时是不能运行和单步调试的,不过有一个方法,就是在RUN|parameter菜单中设置一个宿主程序。在Local页的HOSTAPPLICATION中添加宿主程序的名字就可以单步调试、断点观察和运行了。尽量在自己编写的DLL中加上版本号,直接在delphi的Project|options菜单的version选项是不行的,不过在头部的uses后面加上{$R*.RES}中就可以了。尽量避免和别人的DLL重名。DLL还可以用于资源的载体,如window中的更改图标。
本文标题:Delphi7动态链接库
链接地址:https://www.777doc.com/doc-2909772 .html