Delphi中动态链接库(DLL)的建立和使用

水瓶店里店外

水瓶店里店外

2016-01-29 14:13

Delphi中动态链接库(DLL)的建立和使用,Delphi中动态链接库(DLL)的建立和使用
 

  一.DLL 库内存共享机制

  从使用效果看,DLL和unit 很像,它们都可以被别的工程模块所调用,但二者在内部的实现机制上确存在着差别。如果一个程序模块中用uses语句引用了某个unit,编译程序在编译该模块时,便会连同unit一起编译,并把编译后的可执行代码链接到本程序模块中,这就是一个程序模块能够调用所引用unit中过程和函数的原因。

  当同一个unit被多个工程所引用时,则每个工程中都含有该unit的可执行代码,当含有该unit的多个工程同时执行时,unit的可执行代码会随不同工程而多次被调入内存,造成内存资源的浪费。DLL则不同,它即使被某个工程调用,编译后仍是独立的。

  也就是说编译后,一个DLL库形成一个单独的可执行文件,而不与任何其它的可执行文件连接在一起,因而DLL库并不从属于某个特定的工程,当多个工程调用同一个DLL库时只有第一个工程把DLL库调入内存,其余工程并不重复调入同一个DLL库到内存,而是到同一个共享内存区读取。并且,DLL的执行代码是在程序运行期间动态调入的,而不是如unit在程序运行时就与整个工程一起调入内存。这样便可消除unit带来的相同代码多处占用内存的弊病。

  二 Delphi中DLL库的建立

 在Delphi环境中,编写一个DLL同编写一个一般的应用程序并没有太大的区别。事实上作为DLL主体的DLL函数的编写,除了在内存、资源的管理上有所不同外,并不需要其它特别的手段。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/delphi/)

    一般工程文件的格式为:
  program  工程标题; 
  uses    子句; 
  程序体
  而DLLs工程文件的格式为:
  library 工程标题; 
  uses 子句; 
  exprots 子句; 
  绦蛱?
 它们主要的区别有两点:

  1.一般工程文件的头标用program关键字,而DLL工程文件头标用library 关键字。不同的关键字通知编译器生成不同的可执行文件。用program关键字生成的是.exe文件,而用library关键字生成的是.dll文件;

  2.假如DLL要输出供其它应用程序使用的函数或过程,则必须将这些函数或过程列在exports子句中。而这些函数或过程本身必须用export编译指令进行编译。  在Delphi主菜单file 中选new...项,在弹出的窗口中双击DLL图标,便会自动给出DLL源模块框架,如下:

  Library project1;
  {...注释...}
  uses
  SysUtils, Classes;
  begin
  end. 

  接下来便可在USES和begin之间加入想在该DLL中实现的过程和函数的定义,并用export和exprots保字把它们引出,以便别的模块引用,在begin和end之间加入初始化代码,初始化代码是用来对DLL变量初始化的。应注意,即便无初始化代码begin与end也不可省略,如下例:

  library minmax;
  function Min(X, Y: Integer): Integer; export;
  begin
  if X < Y then Min := X else Min := Y;
  end;
  function Max(X, Y: Integer): Integer; export;
  begin
  if X Y then Max := X else Max := Y;
  end;
  exports
  Min index 1,
  Max index 2;
  begin
  end. 

  经编译后,并以minmax.DLL存盘后,一个DLL库文件便形成了。 
三 DLL库的访问

  访问DLL库有两种方式,一种是静态引用,另一种是动态引用。

  用静态引用这种方法装入DLL要做两件事情:为DLL 库创建一个输入单元,以及用USES把输入单元连接到要使用DLL 函数的程序模块中。为DLL库创建的输入单元与普通的单元的区别仅在于:在它的接口处声明的过程、函数,并不在它的实现部分给出真正的实现代码,而是用external关键字把过程、函数的实现细节委托给外部DLL模块。

  external命令的使用语法如下:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/delphi/)

  procedure /function 过程/函数名;external DLL模块名;

  下面给出为上面创建的minmax.DLL库写的输入单元源文件testdll .pas,从中可看出输入单元与一般单元的一些差别,代码如下所示:
  unit testdll;
  interface
  uses
  function Min (X, Y: Integer): Integer;
  function Max (X, Y: Integer): Integer; 
  implementation 
  function Min; external ‘minmax.DLL’;
  function Max; external ‘minmax.DLL’;<

展开更多 50%)
分享

猜你喜欢

Delphi中动态链接库(DLL)的建立和使用

Delphi
Delphi中动态链接库(DLL)的建立和使用

Delphi 动态链接库编程

编程语言 网络编程
Delphi 动态链接库编程

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

在VC中链接动态链接库(DLL)的方法

编程语言 网络编程
在VC中链接动态链接库(DLL)的方法

链接库动态链接库详细介绍

编程语言 网络编程
链接库动态链接库详细介绍

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

在VC中链接动态链接库(DLL)的方法简要说明

编程语言 网络编程
在VC中链接动态链接库(DLL)的方法简要说明

VC++ MFC DLL动态链接库编写详解

编程语言 网络编程
VC++ MFC DLL动态链接库编写详解

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Delphi让你发送Flash电子邮件

Delphi让你发送Flash电子邮件

Delphi控件 我们也可以(4)

Delphi控件 我们也可以(4)
下拉加载更多内容 ↓