代码之家  ›  专栏  ›  技术社区  ›  Dan

如何从可执行文件调用BPL中的delphi函数?

  •  8
  • Dan  · 技术社区  · 15 年前

    我有一个Delphi应用程序,我为它编写了一个相当简单的wrapper.exe。

    基本上,有一个DLL有许多函数,其中一个函数在包装器完成它所需的工作后,我将迭代调用。我不控制这个dll文件,永远也不会。

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

    3 回复  |  直到 15 年前
        1
  •  10
  •   Rob Kennedy    15 年前

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

    1. 您的项目必须使用与编译包相同的Delphi版本。
    2. 您必须能够访问该单元的DCU文件,或者至少可以访问该包的DCP文件。
    3. 程序启动时,包必须存在于操作系统的搜索路径中。

    如果您不能满足第三个要求,或者您不想一直加载包,那么可以调用 LoadPackage 相反。实现这一目标的方法是 一直在加载。它将被您的项目和您希望加载的包使用。中间包将公开一个接口(例如一些注册函数、变量或类),主包可以使用它来告诉应用程序它的函数是什么。您将无法在应用程序中直接“使用”主包的单元。

    如果你不能满足前两个要求,那么有更难的方法,这也是你需要做的,如果你的应用程序不是用Delphi或C++Builder编写的。将包视为普通的dll。把它装入 LoadLibrary . 使用 GetProcAddress 加载其 Initialize 函数,然后调用它。(记住,呼叫约定是 register ,不是 stdcall ,然后加载您想要调用的函数的地址,记住该函数的名称已被篡改,以包含一些单元和类型信息。呼叫 Finalize 调用前的函数 FreeLibrary . 检查源 加载程序包 UnloadPackage ;是否需要打电话 CheckForDuplicateUnits 可能取决于您能否满足需求1。

        2
  •  2
  •   Mason Wheeler    15 年前

    BPL只是一个包含一些特定添加内容的DLL。从中调用函数应该不会像使用DLL那样困难,但有一个特别的警告:BPL必须与您使用的Delphi版本相同。如果没有源代码,这可能是一个主要的缺点。如果这对您来说是一个问题,您可能应该与创建它的人交谈,并要求他们将其恢复为一个DLL。

        3
  •  1
  •   Henk Holterman    15 年前

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