我有一个 Delphi 应用程序,我为它编写了一个相当简单的包装器 .exe。
基本上,有一个 dll 有一堆函数,一旦我的包装器完成了它需要的操作,我就会迭代地调用其中一个函数。我无法控制这个 dll 文件,也永远不会。
好吧,现在这个 DLL 是一个 BPL,我不确定如何调用该文件中的函数。提前致谢。
使用包中的函数的简单方法是“使用”包含该函数的单元,像往常一样调用它,然后将包放在项目的运行时包列表中。为此,有一些要求:
如果你不能满足第三个要求,或者你不想一直加载包,那么你可以调用LoadPackage
它。完成这项工作的方法是让另一个一直加载的包。您的项目和您希望加载的包都将使用它。中间包将公开一个接口(例如一些注册函数、变量或类),主包可以使用该接口告诉应用程序它的功能是什么。您将无法直接在应用程序中“使用”主包的单元。
如果你不能满足前两个要求,那么有一个更难的方法,如果你的应用程序不是用 Delphi 或 C++ Builder 编写的,这也是你需要做的。将包视为普通 DLL。加载它LoadLibrary
。用于GetProcAddress
加载其Initialize
函数,然后调用它。(请记住调用约定是register
,而不是stdcall
。)然后加载您希望调用的函数的地址,记住函数的名称已被修改为包含一些单位和类型信息。Finalize
在调用之前调用函数FreeLibrary
。检查和的LoadPackage
来源UnloadPackage
;你是否需要打电话CheckForDuplicateUnits
可能取决于你是否能满足要求1。
BPL 只是一个 DLL,其中添加了一些特定的内容。就像使用 DLL 一样,从它调用函数应该没有问题,但有一个特别的警告:BPL 必须构建在与您使用的相同版本的 Delphi 中。如果您没有源代码,这可能是一个主要缺点。如果这对您来说是个问题,您可能应该与创建它的人交谈,并要求他们将其重新制作成 DLL。
BPL 可以消除很多 DLL 问题。如果您可以静态链接它,则边框将变得几乎透明。如果必须动态加载它,则需要一个 DLL 样式的访问函数(通常是返回对象或接口的函数)和一些通用类型(接口)定义。所有这些都应该由 BPL 的制造商提供。