【问题标题】:How do I call Delphi functions in a bpl from an executable?如何从可执行文件中调用 bpl 中的 Delphi 函数?
【发布时间】:2009-09-08 14:20:05
【问题描述】:

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

基本上,有一个 dll 有一堆函数,一旦我的包装器完成了它需要做的事情,我就会迭代地调用其中一个函数。我无法控制这个 dll 文件,而且永远不会。

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

【问题讨论】:

    标签: delphi bpl


    【解决方案1】:

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

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

    如果你不能满足第三个要求,或者你不想一直加载包,那么你可以调用LoadPackage来代替它。完成这项工作的方法是让另一个始终加载 的包。您的项目和您希望加载的包都将使用它。中间包将公开一个接口(例如一些注册函数、变量或类),主包可以使用该接口告诉应用程序它的功能是什么。您将无法直接在应用程序中“使用”主包的单元。

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

    【讨论】:

    • 你有什么办法可以给我一个资源来做这件事吗?我实际上不是 Delphi 程序员,所以我对这些东西不知所措。
    • 我不知道有任何资源描述了如何按照我在最后一段中概述的方式“手动”加载包。如倒数第二段所述,使用包的正常方式是我希望出现在 Delphi 帮助中的内容,尽管我无法自己检查,因为我没有在任何地方安装 Delphi。
    【解决方案2】:

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

    【讨论】:

    • -1,我强烈反对“回到 DLL-Hell”的想法。 BPL 提供了非常丰富的接口和透明的内存管理。
    • 无论您是否喜欢它的含义都不会改变您无法从使用不同版本的 Delphi 编译的 Delphi 可执行文件加载 BPL 的客观事实。如果你知道这样做的方法,我会非常有兴趣知道如何......
    • BPLs 当然可以使用不同的 Delphi 版本构建,如果坚持使用 DLL 接口和 DLL 兼容类型(一开始没有字符串)。
    • 是的,但你知道我的意思。一种使用来自不同 Delphi 版本的扩展 BPL 功能的方法。 AFAIK 它无法完成。
    • 咳咳,仅仅使用 DLL 不会造成“DLL 地狱”。如果是这样,那么 BPL 无论如何也没有什么不同,因为它们是 DLL。使用包也不能解决 DLL 地狱中出现的任何问题。 DLL 地狱是在单个安装位置管理 DLL 的冲突版本的问题。您可以很容易地拥有 BPL 的冲突版本。
    【解决方案3】:

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

    【讨论】:

    • 将“具有一堆函数的 dll,我会调用其中一个函数”放入 BPL 有什么好处?您引用的所有好处似乎对 OP 都不重要。也许他也没有遇到任何这些 DLL 问题?
    • 取决于该函数的参数。 Mayb Dan 可以发布标题行。
    猜你喜欢
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多