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