Windows 的执行文件可以划分为两种形式程序和动态连接库(DLLs)。一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL 中的函数。
当我们调用Windows 中的API 函数的时候,实际上就是调用存储在DLL 中的函数。
在如下几种情况下,调用DLL 是合理的:
1) 不同的程序使用相同的DLL ,这样只需要将DLL 在内存中装载一次,节省了内存的开销。
2) 当某些内容需要升级的时候,如果使用DLL 只需要改变DLL 就可以了,而不需要把整个程序都进行变动。
3) 由于DLL 是独立于语言的,所以,当不同语言习惯的人共同开发一个大型项目的时候,使用DLL 便于程序系统的交流,当然,Delphi开发的DLL 也可以在诸如Visual BASIC,C++ 等系
统中使用。
下面通过几个例子,说明Delphi开发动态连接库的方法和规范。
一、动态连接库构建
SysUtils,
Classes;
SysUtils,Classes,Dialogs,windows;
begin
result:=N+3;
end;
begin
result:=N+2;
end;
begin
showmessage('计算N+3');
result:=N+3;
end;
begin
messagebox(0,'计算N+2','计算N+2',mb_ok);
result:=N+2;
end;
Triple name 'Tr',
Double name 'Do',
Triple1 name 'TrM',
Double1 name 'DoM';
Double:把传入值加二
Triple1:把传入值加三并显示提示
Double1:把传入值加二并显示提示
而stdcall 方式是通过Windows 的标准调用来传递参数,传递秩序从左到右,这种方式适合调用Windows 的API ,在DLL 中,当然要使用这种方式)。
Double name 'Do',
Triple1 name 'TrM',
Double1 name 'DoM';
列出了用户使用这个函数的接口名字。虽然别名不是必须的,但最好给个别名,以便用户程序更容易找到这个函数,同时还要指出,Delphi 6.0取消了Delphi 5.0中允许使用的index ,如果还用Index来指明接口名字,Delphi 6.0中将提示错误。
实例中给出了两种提示方法,主要想说明一个问题:
showmessage(''),是VCL 提供的函数,由于多次编译VCL,做出的程序会比较大。
而messagebox(0,'','',mb_ok) 是Windows提供的API 函数,做出的程序会比较小。
这就是说,编写DLL 程序的时候,要尽量避免多次编译VCL 。作为一个实例,这里把两种方法都列出来了。
首先在implementation下做调用声明
gdi32='mydll.dll';
function Double(N:Integer):integer;stdcall;external gdi32 name 'Do';
function triple1(n:integer):integer;stdcall;external gdi32 name 'TrM';
function Double1(N:Integer):integer;stdcall;external gdi32 name 'DoM';
var N:integer;
begin
N:=updown1.position;
edit1.text:=inttostr(triple(N));
end;
一、在DLL 中放置窗的的方法
在DLL 中,除了放置标准的函数和过程以外,也可以放置已经做好的的delphi窗体,也可以把做好的窗体供其它程序使用,方法是:
2)在implementation下加入接口函数
var Form1: TForm1;
begin
form1:=Tform1.Create(application);
form1.show;
form1.caption:=capt;
end;
3)制作DLL 动态连接库,但要声明:
unit1 in 'unit1.pas';
Createform name 'Myform';
gdi32='myFormdll.dll';
function Createform(capt:string):string;stdcall;external gdi32 name 'Myform';
procedure TForm3.Button1Click(Sender: TObject);
var n,m:string;
begin
m:='我的窗体';
Createform(m);
end;
在窗体调用时,可以用普通的函数方法传递数据,下面举个例子。
做一个改变颜色窗体,放在DLL 中,可以用普通的方法来做,但要作如下声明:
function Getcolor:longint;stdcall;
在implementation区声明一个窗体内全局的变量
var Form1: TForm1;
begin
form1:=Tform1.Create(application);
form1.show;
form1.panel1.Color:=col;
form1.edit1.Text:=inttostr(form1.panel1.Color);
result:=color1;
end;
function Getcolor:longint;stdcall;
begin
result:=color1;
end;
procedure TForm1.ScrollBar1Change(Sender: TObject);
begin
panel2.Color:=RGB(ScrollBar1.Position,ScrollBar2.Position,ScrollBar3.Position);
edit2.Text:=inttostr(panel2.Color);
color1:=panel2.Color;
end;
begin
Free; //析构Form1
end;
运行成功后,再建立动态连接库:
uses
unit1 in 'unit1.pas';
Mycolor name 'My',
Getcolor name 'Get';
end.
首先声明要调用的DLL函数
gdi32='formDll.dll';
function Mycolor(col:longint):longint;stdcall;external gdi32 name 'My';
function Getcolor:longint;stdcall;external gdi32 name 'Get';
begin
Mycolor(color);
end;
begin
color:=getcolor;
end;