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类库
类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...
随机推荐
- mysql bin-log 使用说明
如何开启bin-log日志? vi /etc/my.cnf [mysqld] log-bin=mysql-bin 默认开启 ls /usr/local/mysql/data/ mysql-bin.00 ...
- linux下安装使用libuuid(uuid-generate)
linux下安装使用libuuid(uuid-generate) linux下安装使用libuuid(uuid-generate) UUID简介 安装libuuid库 编写一个程序试一下 代码 编译运 ...
- Python自动化之线程进阶篇
拓展知识 什么是CPU-bound(计算密集型) 和I/O bound(I/O密集型) ? I/O bound 指的是系统的CPU效能相对硬盘/内存的效能要好很多,此时,系统运作,大部分的状况是 CP ...
- python操作memcached以及分布式
memcached 是以 LiveJournal 旗下 Danga Interactive 公司的 Brad Fitzpatric 为首开发的一款软件.现在已成为 mixi.Facebook.Live ...
- @ModelAttribute运用详解
@ModelAttribute使用详解 1.@ModelAttribute注释方法 例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此controller每个 ...
- centos 谷歌浏览器安装
首先,这个是坑 http://www.tecmint.com/install-google-chrome-on-redhat-centos-fedora-linux/ 安装会报错,按照错误找到以下资源 ...
- ndk学习19: 使用Eclipse调试so
1. 设置调试选项 在AndroidManifest文件加入允许调试 android:debuggable="true" 此时编译项目会多出: 2. 配置调试代码 把需要调 ...
- Eclipse不给提示no default proposals
解决方法: (1),找到工程所在的workspace,删除.metadata配置文件. (2),启动eclipse,重新定位到先前的workspace目录置,重建同名工程(不要删除原来的工程,只要建立 ...
- FlexPaper使用小结
FlexPaper相关介绍及后台swf生成,参见 FlexPaper实现文档在线浏览(附源码) 前台swf在flash中的预览: 1.下载相关文档 FlexPaper Classic 2.将下载的文件 ...
- 基于MATLAB的离散小波变换
申明,本文非笔者原创,原文转载自: 基于Matlab的离散小波变换 http://blog.sina.com.cn/s/blog_725866260100ryh3.html 简介 在 ...