一、 DLL的作用
1、 具有一定的安全性
在开发的过程中,把一些具有独立功能的模块或常用函数用DLL封装起来可以加强应用程序的安全性,有效地防止应用程序的被反编译。
2、 可重用性、占用较少资源
标准的DLL有很好的可重用性。当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量;同时还可以被不同的开发语言调用,使得开发人员不再受开发语言的限制,可以有效地调配人力,以补开发力量的不足。
3、 推广模块式体系结构
使用DLL有助于软件开发的模块化,功能独立的模块和一些常用函数都可以用DLL封装起来,让开发团队的人力得到很好的调配,最大限度地达到“各做各”的,避免了相关人员要等着别人把工作做完了自己才有事做的情况。
4、 便于修改和维护
当程序出现问题地时候,开发人员可以快速地进行问题定位,很快地找出问题,不再要求在整个应用程序里查找,有如大海捞针。修改时也不必把整个应用程序重新编译、发布,只要更新相关的DLL。此外,如果这个更新的DLL同时被其它应用程序调用的话,那其它的应用程序也会得到更新。
二、 调用DLL的方法
1、 delphi对DLL的两种调用方式
delphi调用DLL有两种方式:静态调用和动态调用。调用DLL时宿主程序会为此DLL申请相对应的内存空间,静态调用是在宿主程序启动运行时就把DLL加载,直到宿主程序结束时才释放;动态调用是在需要调用时才把dll加载,用完时马上就释放内存空间,有效地利用资源。
DLL函数用例:(dll的窗体与宿主程序的熔合)
function createdllform(p:THandle):THandle;stdcall;
begin
frmdll:=Tfrmdll.Create(Application);
frmdll.Show;
frmdll.ParentWindow:=p;
Result:=frmdll.Handle;
end;
2、 动态调用方式
unit Unit1;
interface
uses
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}
procedure TForm1.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;
interface
uses
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}
procedure TForm1.btn1Click(Sender: TObject);
var
dllfrm:THandle; //DLL函数返回值
i:Integer;
begin
dllfrm:=createdllform(pnl1.Handle);
//SetForegroundWindow(dllfrm);
//Windows.SetFocus(dllfrm);
end;
end.
注 : 以上代码本人在 Delphi7 下调试通过 , 欢迎各位同事一起参与相关技术的讨论 , 表达意见