Delphi中的包(三):bpl和dll

曾经听说过“bpl就是一种特殊的dll”,但是没有想到这句话具 有这么大的意义。最近看到有人在属于某个dpk的Unit里面写export语句,觉得 非常惊奇。但是遍查delphi的help,与export相关的都是library。今天看了 《delphi源代码分析》,才知道上面这句话的含义。因此有下面的推论:

对dll工程来说,exports既可以写在工程文件里面,也可以写在Unit里面, 没什么区别。

bpl是一种dll。

上面的exports很正常。

其实按《delphi源代码分析》里面的说法,bpl只是在dll的基础上添加了一 些特性,比如检查重复Unit之类。操作系统认为bpl和dll是同一类型的文件。而 且书里面给出了对一个最简单bpl的TDump结果:

package NullPackage;
requires
rtl;
end.
E:\ls>tdump -m -ea:v NullPackage.bpl
Exports from NullPackage.bpl
7 exported name(s), 7 export addresse(s). Ordinal base is 1.
Sorted by RVA:
RVA   Ord. Hint Name
-------- ---- ---- ----
0000124C  1 0006 @GetPackageInfoTable
0000124C  2 0003 @NullPackage@@GetPackageInfoTable$qqrv
00001254  3 0002 @NullPackage@@PackageLoad$qqrv
00001254  7 0005 Initialize
00001260  4 0001 @NullPackage@@PackageUnload$qqrv
00001260  6 0004 Finalize
0000126C  5 0000 @NullPackage@initialization$qqrv

看到有好几个函数指向同一个地址了吗?这个大约就是exports的意思了。

时间: 2024-10-30 16:46:30

Delphi中的包(三):bpl和dll的相关文章

Delphi中的包(一):关于exe的编译、连接和执行

首先把需要分析的问题列出来: 什么是包?什么是exe?它们在组成上有什么不同?包跟dcu是什么关系?dcp 是干什么的?这些文件在编译时是什么关系?又是怎么装载的?装载了以后怎么 样操作包?dll可以exports,但是为什么delphi帮助中不提包的exports,但是 有些代码却又在包中使用exprots? 首先来看看delphi的编译过程.delphi的工程中有两类:包和程序,前者的 后缀为dpk,后者为dpr.从简单的开始,先来搞dpr.根据delphi的帮助文档, 一个典型的dpr文件

Delphi中的包(二):关于bpl

写自己的dpk工程,以更改地检测我们的猜想.我们首先建立一个project group,包含三个工程: program ProjectEXE; uses Forms, Windows, UnitFormMain in 'UnitFormMain.pas' {FormMain}; {$R *.res} begin Application.Initialize; Application.CreateForm(TFormMain, FormMain); Application.Run; end. un

Delphi中编写无输出函数名的DLL文件

用 Delphi 用长了,总是发现,有些和 MS 不同的地方.例如,MS 的公开库中,常常隐藏了许多重要函数,这些函数在系统中常常有起着非常巨大的作用.一旦知道如何调用,可以给自己的应用程序提供很强的功能和很大的灵活性.但,这些函数通常又没有函数名(即使用 ExeScope 查看 DLL 文件的导出表也看不出函数意义),仅仅只有一个序号来表示.有时候我又自己想,为什么我在写程序的时候不能学学 MS 隐藏一些自己不希望公开的函数呢? 其实用 Delphi 写 DLL 的时候,使用简单的技巧就可以实

visual studio 2010-VS2010编写的C#dll在delphi中怎么调用?在线急等!

问题描述 VS2010编写的C#dll在delphi中怎么调用?在线急等! 我用C#写了一个dll给delphi调用,可是生成的程序启动不了,提示初始化失败!是什么原因啊?请教了!在线等,解决问题立刻结贴. 解决方案 可以做成com组件供其他程序用 解决方案二: .net的特殊DLL是无法直接给Delphi用的,要么做成Activex,,否则要通过系统程序集的模式注册,然后才能使用,直接当成普通DLL是永不了的 解决方案三: 问题已经解决,谢谢楼上两位!

在Delphi中调用.Net编写的DLL中的函数

最近因公司群发邮件程式需要给注册一段时间没有激活的用户发激活邮件,邮件中有注册密码 需要还原发给用户 但由于密码加密是用C# 中的TripleDES完成,手头上又没有现成Delphi的实现.时间紧急,现翻译是来不及了,于是经过查资料反复实施 终于成功实现在Delphi中调用 C# 封装的DLL中的方法(Function)和过程(Procedure)现把实施步骤写下,以供有需要的XDJM分享: 1.建立:DotNetFunc.cs 封装要使用的Function.Procedure. 2.生成密钥文

delphi-替换Delphi中调用的dll

问题描述 替换Delphi中调用的dll 在一段Delphi编写的dll中调用了另外一个一个A.dll,现在想将这个A.dll替换为自己写的B.dll.只是知道A大概的功能,B是自己写的,中间需要注意些什么? 解决方案 用depend看下导出表,有什么函数名,函数序数,然后用ollydbg之类的工具调试,看看参数是怎么传的,通过堆栈可以分析出来. 然后自己照着写. 解决方案二: Delphi 调用VC的DLLDelphi调用DLL中的接口Delphi调用DLL中的接口

BPL vs. DLL

第一部分:有关包的介绍 一般我们编写编译一个DELPHI应用程序时,会产生一个EXE文件,也就是一个独立的WINDOWS应用程序.很重要的一点:区别于Visual Basic,DELPHI产生的是预先包裹的应用程序是不需要大量的运行库(DLL's). 假设:打开Delphi默认的工程(只有一个空白form),F9她将编译生成一个大约295 KB (Delphi 5)的可执行文件.然后打开Project | Options,把'Build with runtime packages' 选上再编译一

如何在Delphi中调用oracle的存储过程返回数据集

oracle|存储过程|数据 选自CSDN http://search.csdn.net/Expert/topic/2280/2280860.xml?temp=2.169436E-02 论坛中JCC0128 网友的发言 [delphi+oracle报表解决方案(一)]delphi中调用oracle的存储过程(分带返回游标,不返回值两种)  关键字: delphi ,oracle存储过程,游标,返回数据集,报表 注:delphi 6+ oracle 8.1.6 一.创建包与包体 1.附:建表aac

在Delphi中控制扫描仪

在利用Delphi开发信息管理系统时,常常要处理图象,这也是信息管理系统发展的必然趋势.怎样在Delphi中通过扫描仪获得所需的图象信息呢?不外乎有三种基本的方法: 通过图象处理软件,比如说Photoshop等,通过它们的扫描图象的功能,加工成一定格式的图象后再在自己的系统中利用: 通过扫描仪接口Twain.DLL .该接口是在安装扫描仪时提供的,它实际上是一个Plugin插件,它通过一系列函数来控制扫描仪: 通过构件技术来控制扫描仪. 利用第一种方法能减少编程的复杂度,但是系统的集成度不高,用