您的位置:首页 > 编程语言 > Delphi

DLL的作用与用Delphi调用DLL的方法

2008-09-09 19:06 309 查看
一、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下调试通过,欢迎各位同事一起参与相关技术的讨论,表达意见
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: