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下调试通过,欢迎各位同事一起参与相关技术的讨论,表达意见
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下调试通过,欢迎各位同事一起参与相关技术的讨论,表达意见
相关文章推荐
- Delphi环境中编写调用DLL的方法和技巧
- C# 调用 Delphi Dll链接库方法及示例
- delphi调用vc写的dll的方法
- C# 如何调用 Delphi 编写的 DLL 方法
- DELPHI中调用DLL的方法和一些注意事项和技巧
- Delphi调用C++编写的动态链接库dll的方法
- delphi 调用dll中的资源的另类方法
- 在非VS环境下C++ Builder,Delphi,VC,VB等调用C#开发的DLL的完整方法
- Delphi环境中编写调用DLL的方法和技巧
- C# 调用 Delphi Dll链接库方法及示例
- C#调用Delphi的dll的两种方法
- Jnative调用delphi编译的dll解密方法
- Delphi环境中编写调用DLL的方法和技巧
- C# 如何调用 Delphi 编写的 DLL 方法
- delphi动态调用DLL的方法与技巧
- C#调用Delphi的dll的两种方法
- DELPHI中调用DLL的方法和一些注意事项和技巧
- C# 调用 Delphi Dll链接库方法及示例
- Delphi中动态调用DLL的方法
- 调用外部DLL,如:DelphiC++Java的DLL的调用方法,给出代码片段?