如何从可执行文件中调用bpl中的Delphi函数?

时间:2009-09-08 14:20:05

标签: delphi bpl

我有一个Delphi应用程序,我编写了一个相当简单的包装器.exe for。

基本上,有一个dll有一堆函数,其中一个我会在我的包装器完成所需的操作后迭代调用。我无法控制这个dll文件,也永远不会。

好吧,现在这个DLL是一个BPL,我不知道如何调用该文件中的函数。提前谢谢。

3 个答案:

答案 0 :(得分:10)

使用包中函数的简单方法是“使用”包含该函数的单元,像往常一样调用它,并将包放在项目运行时包的列表中。为了实现这一目标,有一些要求:

  1. 您的项目必须使用与编译程序包相同的Delphi版本。
  2. 您必须有权访问本机的DCU文件,或至少访问该软件包的DCP文件。
  3. 程序启动时,程序包必须存在于操作系统的搜索路径中。
  4. 如果您无法满足第三个要求,或者您不想一直加载包,那么您可以为其调用LoadPackage。实现这项工作的方法是让另一个 一直加载的包。它将由您的项目和要加载的包使用。中间包将公开一个接口(例如一些注册函数,变量或类),主包可以使用它来告诉应用程序它的功能是什么。您将无法直接在应用程序中“使用”主程序包的单元。

    如果你不能满足前两个要求,那么就有更难的方法,如果你的应用程序不是用Delphi或C ++ Builder编写的,那么你也需要这样做。像普通的DLL一样对待包。加载LoadLibrary。使用GetProcAddress加载其Initialize函数,然后调用它。 (请记住,调用约定是register,而不是stdcall。)然后加载要调用的函数的地址,请记住函数的名称已经被修改为包含一些单位和类型信息。在致电Finalize之前,请致电FreeLibrary功能。检查LoadPackageUnloadPackage的来源;是否需要致电CheckForDuplicateUnits可能取决于您是否可以满足要求编号1。

答案 1 :(得分:2)

BPL只是一个带有一些特定添加项的DLL。你可以毫不费力地调用函数,就像你对DLL一样,有一个特别的警告:BPL必须在你正在使用的相同版本的Delphi中构建。如果您没有源代码,这可能是一个主要缺点。如果这对您来说是一个问题,您应该与创建它的人交谈并要求他们将其重新编写为DLL。

答案 2 :(得分:1)

BPL可以消除很多DLL问题。如果您可以静态链接它,边框将变得完全透明。如果必须动态加载它,则需要一个DLL样式的访问函数(通常是返回对象或接口的函数)和一些常见的类型(接口)定义。所有这些都应该由BPL的制造商提供。