下面是在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. JNI_Android项目中调用.so动态库实现详解

    转自:http://www.yxkfw.com/?p=7223 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj. ...

  2. OpenCV进阶之路:神经网络识别车牌字符

    1. 关于OpenCV进阶之路 前段时间写过一些关于OpenCV基础知识方面的系列文章,主要内容是面向OpenCV初学者,介绍OpenCV中一些常用的函数的接口和调用方法,相关的内容在OpenCV的手 ...

  3. Android自定义标题栏

    预览一下效果: 素材: 新建一个布局title_bar.xml,代码如下: <?xml version="1.0" encoding="utf-8"?&g ...

  4. java检测文件内是否包含指定内容

    package com.test; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.File ...

  5. TortoiseGit 添加邮箱 失败保存配置

    解决方法   将保存至改为此版本库

  6. Java 日期加减计算.

    1.用Java.util.Calender来实现 Calendar calendar=Calendar.getInstance();      calendar.setTime(new Date()) ...

  7. Java文件读写操作指定编码方式防乱码

    读文件:BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而提供字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Re ...

  8. bitnami-redmine 安装与插件使用

    bitnami-redmine 公司要进行敏捷开发管理,选择Redmine作为管理工具. 而Redmine本身的需要的环境比较麻烦,需要安装mysql,ruby,redmine,apach. Bitn ...

  9. oracle数据库两表数据比较

    本文转自http://blog.sina.com.cn/s/blog_3ff4e1ad0100tdl2.html 1 引言 在程序设计的过程中,往往会遇到两个记录集的比较.如华东电网PMS接口中实现传 ...

  10. mysql创建用户

    mysql创建用户 创建用于localhost连接的用户并指定密码 mysql> create user 'pcom'@'localhost' identified by 'aaa7B2249' ...