Delphi之DLL知识学习4---创建DLL
下面是在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的更多相关文章
- Delphi之DLL知识学习3---为什么要使用DLL
使用DLL有若干理由,其中有一些前面提到过的.大体说来,使用动态链接库可以共享代码.系统资源,可以隐藏实现的代码或底层的系统例程.设计自定义控件 一.共享代码.资源和数据 前面已经提到,共享代码是创建 ...
- Delphi之DLL知识学习1---什么是DLL
DLL(动态链接库)是程序模块,它包括代码.数据或资源,能够被其他的Windows 应用程序共享.DLL的主要特点之一是应用程序可以在运行时调入代码执行,而不是在编译时链接代码,因此,多个应用程序可以 ...
- Delphi之DLL知识学习5---在Delphi应用程序中使用DLL
首先说明一下:同一个动态库(DLL)被多个的程序加载的话,那么将会在每次加载的时候都会重新分配新的独立的内存空间,绝对不是共用一个,所以当一个DLL被多次加载的时候,其会在内存中“复制”多份,不会互相 ...
- Delphi之DLL知识学习2---静态链接和动态链接
静态连接 静态链接是指Delphi 编译器把要调用的函数和过程编译成可执行代码.函数的代码可存留在应用程序的 .dpr文件或一单元中.当链接用户的应用程序时,这些函数与过程便成为最终的可执行文件的一部 ...
- VS2010环境下用ANSI C创建DLL和使用方法(转)
源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...
- delphi 创建DLL文件 及其调用和注意事项
首先创建一个DLL文件,项目自带的代码为: library ProjectPnr; { Important note about DLL memory management: ShareMem mus ...
- 关于DLL的学习
1.前言: 人总归还是要有梦想的,不然跟咸鱼有什么区别.这一周给自己定下了研究DLL的任务还是要逼自己完成的呀,上了一天的党校,游戏也不打在这里写博,心疼自己.话说为什么要给自己下这样一个任务呢,是因 ...
- Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)最近用C#.Net写了一个公用模块, 本以为仅提供给.Net程序使用, 但是领导要求把这些功能提供给旧系统使用, 天啦, 几套旧系统全是D ...
- C#创建dll类库
类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...
随机推荐
- 一个CMS案例实战讲解PHP代码审计入门
前言 php代码审计介绍:顾名思义就是检查php源代码中的缺点和错误信息,分析并找到这些问题引发的安全漏洞. 1.环境搭建: 工欲善其事必先利其器,先介绍代码审计必要的环境搭建 审计环境 window ...
- 百度地图API 海量点 自定义添加信息
<!--添加百度地图--> <script type="text/javascript" src="http://api.map.baidu.com/a ...
- struts2将servlet对象注入到Action中
在struts2框架中,可以通过IoC方式将servlet对象注入到Action中,通常需要Action实现以下接口: a. ServletRequestAware: 实现该接口的Action可以直接 ...
- C#的contextMenuStrip右键没反应的可能原因
contextMenuStrip设置右键菜单,但是新手常常忽略一个问题,我要遇到了,即没有设置contextMenuStrip所在控件的contextMenuStrip属性,需要把contextMen ...
- apache开启虚拟主机localhost无法访问
今天在集成环境下配虚拟主机,没想到虚拟主机开启后,localhost竟然无法访问了,解决办法是这样的: 实例一,Apache 配置localhost虚拟主机步骤 1,用记事本打开apache目录下ht ...
- 解析sql语句中left_join、inner_join中的on与where的区别
以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下 table a(id, type):id type ---- ...
- 【转】Git如何Check Out出指定文件或者文件夹
[转]Git如何Check Out出指定文件或者文件夹http://www.handaoliang.com/a/20140506/195406.html 在进行项目开发的时候,有时候会有这样的需求那就 ...
- W3C标准
W3C标准:World Wide Web Consortium 万维网联盟创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构.到目前为止,W3C已经发布了200多项影响深远的W ...
- SAP ALV OO 选择行打印
&---------------------------------------------------------------------* *& Report ZSDF001 * ...
- Effective C++ -----条款09:绝不在构造和析构过程中调用virtual函数
在构造和析构期间不要调用virtual函数,因为这类调用从不下降至derived class(比起当前执行构造函数和析构函数的那层).