当前位置:首页 > Windows程序 > 正文

delphi 基础之三 编写和调用dll文件

2021-05-24 Windows程序

delphi 编写和调用dll文件

 

Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs)。一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数。 

在如下几种情况下,调用DLL 是合理的: 

1) 不同的程序使用相同的DLL ,这样只需要将DLL 在内存中装载一次,节省了内存的开销。 

2) 当某些内容需要升级的时候,如果使用DLL 只需要改变DLL 就可以了,而不需要把整个程序都进行变动。 

3) 由于DLL 是独立于语言的,所以,当不同语言习惯的人共同开发一个大型项目的时候,使用DLL 便于程序系统的交流,当然,Delphi开发的DLL 也可以在诸如Visual BASIC,C++ 等系统中使用。 

下面通过几个例子,说明Delphi开发动态连接库的方法和规范。 

第一节 动态连接库的构建和调用方法 

一、动态连接库构建

1.创建了一个动态连接库的基本模块

File---New---Other---DLL Wizard 

library Project1;

{如果DLL输出的过程或函数带有长字符类型的参数,或者函数返回类型是长字符串或带有长字符串元素的构造类型,Object Pascal规定无论是DLL还是调用它的程序必须把ShareMem单元加到Uses部分。而ShareMem单元是从DelphiMM.DLL这个DLL中引入的接口单元,因此这种程序分发时必须带有DelphiMM.DLL。Delphi建议为了避免使用DELPHIMM.DLL,,传递字符串信息时使用PChar或ShortString类型参数。(原文为英文) }

uses 

SysUtils,  Classes;

 

代码部分)

 

 {$R *.res} 

begin 

end. 

把工程名改为Math(Save Project  as …),并写入必要的函数 

library Math;

uses

  SysUtils,

  Classes;

 

function Mround (d:Double ):Double ;stdcall;   //四舍五入函数:数学上的四舍五入函数不begin                                       //同于Delphi的银行家四舍五入法

Result:=Int(d*100+0.5)/100;

end;

exports

Mround ;

{$R *.RES}

begin

end.

从这个例子中可以看出DLL 程序的几个规则: 

1) 在DLL 程序中,输出函数必须被声明为stdcall,以使用标准的Win32 参数传递技术来代替优化的Register。参数的调用约定。调用约定如下:

指令  传递顺序  参数删除

stdcall 从左到右 函数方面

cdecl  从右到左 调用方面

Pascal  从左到右 函数方面

register 从左到右 函数方面

(说明:

register,默认,即是 唯一使用 CPU寄存器的参数传递方式,也是传递速度最快的方式; pascal: 调用协议仅用于向后兼容,即向旧的版本兼容;
cdecl: 多用于 C和 C++语言编写的例程,也用于需要由调用者清除参数的例程; stdcall: 和safecall主要用于调用Windows API 函数;其中safecall还用于双重接口。

2)所有的输出函数都必须列在exports子句下面,这使的子例程在DLL外部就可以看到

exports

Mround[name ‘别名’] ;

列出了用户使用这个函数的接口名字。虽然别名不是必须的,但最好给个别名,以便用户程序更容易找到这个函数,同时还要指出Delphi 6.0取消了Delphi 5.0中允许使用的index 如果还用Index指明接口名字,Delphi 6.0中将提示错误。

实例中给出了messagebox提示方法,主要想说明一个问题:

而messagebox(0,’’,’’,mb_ok) 是Windows提供的API 函数,做出的程序会比较小。

Showmessage(‘’),是VCL 提供的函数,由于多次编译VCL,做出的程序会比较大。 

这就是说,编写DLL 程序的时候,要尽量避免多次编译VCL 。作为一个实例,这里把两种方法都列出来了。 

2.保存 

3.编译:Projrct---Build Math.DLL

这就完成了一个简单的动态连接库的编写。 

二、             动态连接库的调用

1.静态调用

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70346.html