一、DLL的作用1、 具有一定的安全性 在开发的过程中,把一些具有独立功能的模块或常用函数用DLL封装起来可以加强应用程序的安全性,有效地防止应用程序的被反编译。2、 可重用性、占用较少资源标准的DLL有很好的可重用性。当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量;同时还可以被不同的开发语言调用,使得开发人员不再受开发语言的限制,可以有效地调配人力,以补开发力量的不足。3、 推广模块式体系结构 使用DLL有助于软件开发的模块化,功能独立的模块和一些常用函数都可以用DLL封装起来,让开发团队的人力得到很好的调配,最大限度地达到“各做各”的,避免了相关人员要等着别人把工作做完了自己才有事做的情况。4、 便于修改和维护 当程序出现问题地时候,开发人员可以快速地进行问题定位,很快地找出问题,不再要求在整个应用程序里查找,有如大海捞针。修改时也不必把整个应用程序重新编译、发布,只要更新相关的DLL。此外,如果这个更新的DLL同时被其它应用程序调用的话,那其它的应用程序也会得到更新。二、调用DLL的方法1、 delphi对DLL的两种调用方式 delphi调用DLL有两种方式:静态调用和动态调用。调用DLL时宿主程序会为此DLL申请相对应的内存空间,静态调用是在宿主程序启动运行时就把DLL加载,直到宿主程序结束时才释放;动态调用是在需要调用时才把dll加载,用完时马上就释放内存空间,有效地利用资源。 DLL函数用例:(dll的窗体与宿主程序的熔合) functioncreatedllform(p:THandle):THandle;stdcall; begin frmdll:=Tfrmdll.Create(Application); frmdll.Show; frmdll.ParentWindow:=p; Result:=frmdll.Handle; end;2、 动态调用方式unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants,Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) btn1: TButton; pnl1: TPanel; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; //定义DLL的相关回调函数 Tcreatedllform = function (p:THandle):THandle; stdcall;var Form1: TForm1;Implementation{$R *.dfm}procedureTForm1.btn1Click(Sender: TObject);var l:THandle; //返回的DLL的句柄 dllfrm:THandle; //DLL函数返回值 p:Tcreatedllform; i:Integer;begin l:=LoadLibrary('Project1.dll'); if l<>0 then @p:=GetProcAddress(l,PChar('createdllform')); if Assigned(p) then dllfrm:=p(pnl1.Handle); FreeLibrary(l);end;end.3、 静态调用方式unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants,Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) btn1: TButton; pnl1: TPanel; procedure btn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; //定义DLL的相关回调函数 function createdllform(p:THandle): THandle; stdcall;external 'Project1.dll';implementation{$R *.dfm}procedureTForm1.btn1Click(Sender: TObject);var dllfrm:THandle; //DLL函数返回值 i:Integer;begin dllfrm:=createdllform(pnl1.Handle); //SetForegroundWindow(dllfrm); //Windows.SetFocus(dllfrm);end;end.
P: procedure(): XXX;stdcall;external 'YourDll.dll';p:过程变量名procedure 也有可能是 function 看你Dll中提供的方法XXX: 你所定义的方法类型