下面是在Delphi中创建一个DLL的全过程,你将看到怎样创建一个接口单元,使之可以被其他的应用程序访问。并且将学会怎么把Delphi的窗体加入DLL中。

  

一、数美分:一个简单的DLL

  下面是包含一个例程的DLL例子。该例程是将以美分计算的货币换算成五分镍币、一角硬币的数目。

1.一个简单的DLL

  该DLL中包含PenniesToCoins()函数,下面完整的显示了该DLL项目文件代码

library PenniesLib;
{$DEFINE PENNIESLIB}
uses
SysUtils, Classes, PenniesInt;
function PenniesToCoins(TotPennies: word; CoinsRec: PCoinsRec): word; stdcall;
begin
Result:= TotPennies; //结果存放于Result
{计算Quarters、Dimes、Nickels、Pennies的值}
with CoinsRec^ do
begin
Quarters:= TotPennies div 25;
TotPennies:= TotPennies - Quarters * 25;
Dimes:= TotPennies div 10;
TotPennies:= TotPennies - Dimes * 10;
Nickels:= TotPennies div 5;
TotPennies:= TotPennies - Nickels * 10;
Pennies:= TotPennies;
end;
end; {引出函数名}
exports
PenniesToCoins; end.

  注意,该DLL使用了PenniesInt单元,这将在后面详细介绍

  在Exports子句引出了DLL中应用程序要调用的函数或过程

2.定义接口单元

  接口单元通过把引入单元的名字加入 uses子句中,实现调用DLL的应用程序能够静态地引入DLL的例程。接口单元也允许定义成DLL的调用应用程序都能使用的公共结构。下面就有一个接口单元论证了这点

unit PenniesInt;
{PENNIES.DLL的接口例程} interface
type
{这个记录将保存转换后的货币数}
PCoinsRec = ^TCoinsRec;
TCoinsRec = record
Quarters,
Dimes,
Nickels,
Pennies: word;
end; {$IFNDEF PENNIESLIB}
{由关键词export声明函数}
function PenniesToCoines(TotPennies: word; CoinsRec: PCoinsRec): word; Stdcall;
{ENDIF} implementation
{$IFNDEF PENNIESLIB}
{定义引入的函数}
function PenniesToCoins; external 'PENNIESLIB.DLL' name 'PenniesToCoins';
{$ENDIF} end.

  在这个项目中的type 部分,声明了一个叫 TCoinsRec的记录以及指向该记录的指针。这个记录保存传递给PenniesToCoins() 的货币数转换后的结果。函数PenniesToCoins() 带有两个传递参数:以美分为单位的货币数和指向TCoinsRec变量的指针。函数的返回值是换算后的货币数

  PenniesInt.pas 在其接口单元中声明了函数,该函数要从DLL中引出。PenniesToCoins() 函数的定义放在 implementation部分,这个定义指明该函数是存在于DLL文件(PenniesLib.dll)中的一个外部函数。链接是按函数的名称进行的。请注意:这里用了一条编译指令: PENNIESLIB,用于有条件的编译PenniesToCoins() 寒素的声明。这样做事因为在编译该接口单元时,对DLL来说,是没有必要编译函数的声明。这样,DLL和调用DLL的应用程序就可以共享接口单元,如果要改变二者使用的结构,只需要修改单元接口

  提示:要定义一个应用程序范围的条件指令,可以在Options对话框 Eirectories/Conditionals页上指定该条件。值得注意的是,为使该条件指令有效,必须重新编译程序项目,这是因为make逻辑中需要加上条件定义

  注意:下面定义是引入一个DLL例程的两种方法之一

function PenniesToCoins; external 'PENNIESLIB.DLL' index 1';

  这种方称为按序号引入,另一种方式是按名称引入

function PenniesToCoins; external 'PENNIESLIB.DLL' name 'PenniesToCoins';

  按名称引入时,紧跟在关键字 name后面的标识符就是例程在DLL中的名称

  因为按序号引入例程不必在DLL的名称表中查找,所以减少了DLL的调入时间。然而,在Win 32中,最好的方法不使用这个方法,而是按名称引入例程。因为当 DLL有所改动时,应用程序不必理睬DLL整体序号的变动。如果按序号引入,就捆绑到DLL的具体位置;如果按名称引入,则捆绑到例程名,而不必管它在DLL中的位置。

  如果把上面的DLL共享出去,就必须想你的用户提供 PenniesLib.dll 和PenniesInt.pas。 这样,就使他们可以通过定义这里有 PenniesLib.dll所要求在PenniesInt.pas中定义的类型和例程使用该DLL。

  再者如果程序员使用的是其他语言,譬如 C++ ,这就需要将PenniesInt.pas 转换为他所使用的语言,这样,在这些开发环境下才可以使用该 DLL

二、显示DLL中的模式窗体

  。。。。。。

三、显示DLL中的无模式窗体

  。。。。。。

Delphi之DLL知识学习4---创建DLL的更多相关文章

  1. Delphi之DLL知识学习3---为什么要使用DLL

    使用DLL有若干理由,其中有一些前面提到过的.大体说来,使用动态链接库可以共享代码.系统资源,可以隐藏实现的代码或底层的系统例程.设计自定义控件 一.共享代码.资源和数据 前面已经提到,共享代码是创建 ...

  2. Delphi之DLL知识学习1---什么是DLL

    DLL(动态链接库)是程序模块,它包括代码.数据或资源,能够被其他的Windows 应用程序共享.DLL的主要特点之一是应用程序可以在运行时调入代码执行,而不是在编译时链接代码,因此,多个应用程序可以 ...

  3. Delphi之DLL知识学习5---在Delphi应用程序中使用DLL

    首先说明一下:同一个动态库(DLL)被多个的程序加载的话,那么将会在每次加载的时候都会重新分配新的独立的内存空间,绝对不是共用一个,所以当一个DLL被多次加载的时候,其会在内存中“复制”多份,不会互相 ...

  4. Delphi之DLL知识学习2---静态链接和动态链接

    静态连接 静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码.函数的代码可存留在应用程序的 .dpr文件或一单元中.当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部 ...

  5. VS2010环境下用ANSI C创建DLL和使用方法(转)

    源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...

  6. delphi 创建DLL文件 及其调用和注意事项

    首先创建一个DLL文件,项目自带的代码为: library ProjectPnr; { Important note about DLL memory management: ShareMem mus ...

  7. 关于DLL的学习

    1.前言: 人总归还是要有梦想的,不然跟咸鱼有什么区别.这一周给自己定下了研究DLL的任务还是要逼自己完成的呀,上了一天的党校,游戏也不打在这里写博,心疼自己.话说为什么要给自己下这样一个任务呢,是因 ...

  8. Delphi程序调用C#.Net编译的DLL并打开窗体(详解)

    Delphi程序调用C#.Net编译的DLL并打开窗体(详解)最近用C#.Net写了一个公用模块, 本以为仅提供给.Net程序使用, 但是领导要求把这些功能提供给旧系统使用, 天啦, 几套旧系统全是D ...

  9. C#创建dll类库

    类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...

随机推荐

  1. 一个CMS案例实战讲解PHP代码审计入门

    前言 php代码审计介绍:顾名思义就是检查php源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞. 1.环境搭建: 工欲善其事必先利其器,先介绍代码审计必要的环境搭建 审计环境 window ...

  2. 百度地图API 海量点 自定义添加信息

    <!--添加百度地图--> <script type="text/javascript" src="http://api.map.baidu.com/a ...

  3. struts2将servlet对象注入到Action中

    在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口: a. ServletRequestAware: 实现该接口的Action可以直接 ...

  4. C#的contextMenuStrip右键没反应的可能原因

    contextMenuStrip设置右键菜单,但是新手常常忽略一个问题,我要遇到了,即没有设置contextMenuStrip所在控件的contextMenuStrip属性,需要把contextMen ...

  5. apache开启虚拟主机localhost无法访问

    今天在集成环境下配虚拟主机,没想到虚拟主机开启后,localhost竟然无法访问了,解决办法是这样的: 实例一,Apache 配置localhost虚拟主机步骤 1,用记事本打开apache目录下ht ...

  6. 解析sql语句中left_join、inner_join中的on与where的区别

    以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下 table a(id, type):id     type ---- ...

  7. 【转】Git如何Check Out出指定文件或者文件夹

    [转]Git如何Check Out出指定文件或者文件夹http://www.handaoliang.com/a/20140506/195406.html 在进行项目开发的时候,有时候会有这样的需求那就 ...

  8. W3C标准

    W3C标准:World Wide Web Consortium 万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构.到目前为止,W3C已经发布了200多项影响深远的W ...

  9. SAP ALV OO 选择行打印

    &---------------------------------------------------------------------* *& Report  ZSDF001 * ...

  10. Effective C++ -----条款09:绝不在构造和析构过程中调用virtual函数

    在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层).