动态调入库(dynamically loadable library)在Windows 下是一个动态链接库(dynamic-link library,DLL),
在Linux 下是一个共享目标库(shared object library)
导入过程或函数最简单的方法是用external 指示字声明它们,比如,
在Windows 下: procedure DoSomething; external ’MYLIB.DLL’;
在Linux 下: procedure DoSomething; external ’mylib.so’;
你可以直接调用操作系统的库函数来访问一个库中的例程,这些库函数包括LoadLibrary、FreeLibrary 和
GetProcAddress。在Windows 下,这些函数在Windows.pas 单元声明,在Linux 下,为了兼容性考虑,
它们在SysUtils.pas 单元实现,实际的Linux 例程是dlopen、dlclose 和dlsym(这些都在Kylix 的Libc 单
元声明)。此时,我们使用过程类型的变量来引用导入的例程。
当一个例程在exports 子句中列出时,它将被输出,它的格式如下
exports entry1, ..., entryn;
只有在Windows 下能使用索引说明符,它包括指示字index,后面跟一个介于1 到2,147,483,647 之间的
数字常量(为提高程序效率,使用较小的索引值)。若入口中没有指定索引,在输出表中例程被自动赋予
一个号码。
名称说明符包括指示字name,后面跟一个字符串常量。若入口没有名称说明符,例程被输出时使用声
明的原始名称,包括拼写和大小写。当要使用不同的名称输出一个例程时,使用name 子句。比如,
exports
DoSomethingABC name ’DoSomething’;
当在动态调入库中输出重载的函数或过程时,你必须在exports 子句中指定它的参数列表
exports 子句可出现在程序或库声明部分的任何位置,次数也不受限制,同样,当出现在单元的接口或实
现部分时,情况也是如此。程序很少包含exports 子句。
一个库的块(block)所包含的语句构成了库的初始化代码,每当库被调入时,这些代码执行一次。它们
的典型任务包括注册窗口类和初始化变量等。库的初始化代码也可以使用ExitProc 变量安装一个退出过
程(exit procedure),就像在Exit procedures 中描述的那样。退出过程在库被卸载时执行。
库的初始化代码通过设定ExitCode 变量为非0 来标记一个错误。ExitCode 在System 单元声明,默认值
时0。若库的初始化代码把ExitCode 设置为其它值,库将被卸载,调用程序被通知发生了错误。类似地,
若初始化代码执行中发生了未处理的异常,调用程序也将被通知调入库时失败。
在共享库中声明的全局变量不能被Object Pascal 程序导入。
使用IsLibrary 变量来确定代码是作为程序还
是库执行,IsLibrary 在程序中总是True,在库中总是False。在库的生命期内,HInstance 存储了它的
实例句柄,CmdLine 在库中总是nil。
DLLProc 变量允许一个库监测操作系统对它的入口点(entry point)的调用,这个特征通常只是由支持多
线程的库使用。DLLProc 在Windows 和Linux 下都存在,但用起来不同。在Windows 下,DLLProc 用
于多线程程序,在Linux 下,它用来判断库何时被卸载。对所有的退出行为,你应该使用finalization
sections,而不是退出过程。
在Windows 下,若DLL 输出的例程以长字符串或动态数组作为参数或者作为函数的返回值(不管是直
接的,还是通过记录或对象封装的),那么,DLL 和它的客户程序(或DLL)必须使用ShareMem 单元;
当一个程序或DLL 调用New 或GetMem 分配内存,而在另一个模块中调用Dispose 或FreeMem 来释放
内存时,上面的规则同样适用。ShareMem 单元应当在程序或库的uses 子句中第一个列出。
ShareMem 是BORLANDMM.DLL 内存管理器的接口单元,它允许在模块间共享动态分配的内存。
BORLANDMM.DLL必须连同使用ShareMem单元的程序和DLL一同发布。当程序或DLL使用ShareMem
时,它的内存管理器被BORLANDMM.DLL 中的取代。
Linux 使用glibc 的malloc 来管理共享内存。
为了区分包和其它库,包被存储在文件
• 在Windows 下,包的扩展名是.bpl(Borland package library)
• 在Linux 下,包通常以前缀bpl 开始,扩展名是.so。
通常,程序启动时包被静态调入,但你可以使用LoadPackage 和UnloadPackage 例程(在SysUtils 单元)
来动态调入包。
包源文件不包括类型、数据、过程或函数声明。取而代之的是,它包含
• 包的名称;
• 它所需要的其它包的列表。这些包被链接到新包中;
• 包被编译时所包含的(或绑定的)单元文件列表。包实际上是这些代码单元的一个外包装,这些单
元为编译后的包提供功能。
包的声明有如下形式:
package packageName;
requiresClause;
containsClause;
end.
package DATAX;
requires
baseclx,
visualclx;
contains Db, DBLocal, DBXpress, ... ;
end.
分享到:
相关推荐
下面我们将详细探讨如何在Delphi中调用DLL和BPL。 ### DLL的使用 1. **创建DLL项目**:在Delphi中创建一个新的项目,选择“动态链接库”模板。在这个项目中,你可以定义函数和过程供其他程序调用。 2. **导出函数...
在Delphi中,DLL和BPL可以混合使用,为软件设计提供更大的灵活性。 本资源包含的"Tangram2.6(D7)"可能是一个基于Delphi 7的项目,Tangram可能是一个框架的名字,它展示了如何将BPL和DLL集成到一个EXE程序中。通过...
"delphi bpl和dll调用框架"是一个专门针对这两个概念设计的实践框架,它已经在Delphi 2010环境下进行了完整的调试和验证。 首先,我们要理解BPL的概念。BPL是Delphi中的二进制包库,它是将类、接口和其他代码实体...
在Delphi编程环境中,BPL(Borland Package Library)是一种动态链接库,它允许开发者将代码组织成可重用的模块,便于分发、更新和动态加载。本示例源码提供了创建BPL和动态调用BPL的详细过程,适用于Delphi 10 ...
在这个“DelphiDLL.rar”压缩包中,包含了一个基于Delphi的BPL( Borland Package Library)和DLL的项目解决方案,旨在展示如何在Delphi中创建和使用这些组件。 首先,我们来详细了解BPL。BPL是Delphi中的一个特殊...
### BPL调用举例(Delphi) #### 一、引言 在Delphi开发环境中,BPL(Borland Package Library)是一种常见的组件打包格式,主要用于封装编译后的组件类库,便于重用与分发。本文将通过一系列示例详细介绍如何在...
在Delphi编程环境中,BPL(Borland Package Library)和DLL(Dynamic Link Library)是两种常见的库文件格式,用于代码重用和模块化开发。本案例“BPL和DLL中Form共享数据库连接和模块调用的例子”展示了如何在这些...
Delphi EXE + BPL + DLL框架(源代码和示例) 在Delphi开发领域,追求灵活与高效的你是否还在为频繁的EXE更新而头疼?来尝试这一革命性的框架设计吧!本资源为你呈现一个先进的Delphi应用程序架构,它将彻底改变你对...
在Delphi中,我们可以创建三种不同类型的可执行模块:DLL(动态链接库)、EXE(可执行程序)和BPL(Delphi包)。下面将详细解释这些概念以及它们在Delphi开发中的作用。 1. DLL(动态链接库): DLL是Windows操作...
详述了Delphi中各种库的用法和区别:BPL DLL EXE的联系与区别
这可能包括了如何使用DLL和BPL来分离功能模块,减少EXE的体积,以及如何通过接口实现组件之间的通信和解耦。此外,还可能涉及到动态加载DLL、BPL,以及如何在运行时通过接口调用它们提供的服务。这样的演示对于学习...
Delphi是Object Pascal的一种现代实现,广泛用于Windows平台的软件开发,它的核心特点之一就是组件化编程,dll和bpl正是这种组件化的一个体现。 DLL(Dynamic Link Library)是Windows操作系统中的一种共享库机制,...
首先,理解BPL文件:BPL是Delphi中用于分发和使用组件的机制,它可以包含一个或多个组件、类或者其他可重用的代码单元。创建BPL的过程通常包括编译和链接一个或多个DCU(Delphi编译单元)文件,然后打包成动态库。 ...
RXBDE5.BPL、DCLRX5.BPL、 DCLRXDB5.BPL 和DCLRXBD5.BPL。 打开 Rx 的运行包 RXCTL5.DPK,在 Package 窗口中按 Compile 按钮编译 RXCTL5.DPK , 然后用同样方法编译另两个运行包RXDB5.DPK 和 RXBDE5.DPK ,将编译后...
在Delphi编程环境中,动态调用BPL(Binary Package Library)函数是一种常见的技术,它可以显著提高应用程序的灵活性和模块化程度。BPL是Delphi的一种组件包机制,它允许我们将代码封装到独立的动态链接库中,然后在...
Delphi EXE BPL DLL Interface Package 解决方案 Delphi EXE BPL DLL Interface Package 解决方案 Delphi EXE BPL DLL Interface Package 解决方案
BPL是一个包含Delphi组件、类和方法的库文件,类似于.NET中的DLL。当应用程序运行时,可以按需加载BPL,而不是在编译时就将其包含在主程序中。这样可以减少主程序的体积,因为只包含运行时需要的代码。 创建BPL动态...
BPL是Delphi中的一个组件库文件格式,类似于DLL动态链接库,但包含了更多元化的功能,如VCL组件、类库等。开发者可以将特定功能封装到一个BPL包中,然后在运行时根据需要动态加载,从而减小主程序的体积,同时提高...
在 Delphi 开发环境中,BPL(Binary Package Library)是一种重要的组件封装技术,它与 DLL(Dynamic Link Library)相似,但具有更多的优势和灵活性。BPL 文件是 Delphi 的二进制包,允许开发者将代码模块化,提高...
对于Delphi的.exe、.dcu和.bpl文件,反编译工具如Jedi反编译器(JAD)、Decompiler for Delphi(DEE)或RAD Studio的逆向工程插件可以帮助开发者分析这些文件。不过要注意,反编译可能涉及版权和法律问题,只有在...