3

我在一个单元有一个班。通常,当我更改其方法的算法时,我必须重新编译它并将补丁作为一个整体交付。我认为使用 DLL 创建类的实例。在delphi.about.com上搜索后,发现不用DLL,可以用BPL。它是 Delphi 的 DLL。问题是我发现的几乎所有示例都只是告诉如何导出函数。我想动态加载BPL,每当我替换BPL时,我都可以获得类的最新算法,而不仅仅是我导出的函数。

我读过的文章:
- http://delphi.about.com/od/objectpascalide/a/bpl_vs_dll.htm
- Delphi 应用程序的插件系统 - bpl vs dll?
- http://delphi.about.com/library/weekly/aa012301a.htm

非常感谢任何如何从头开始创建 BPL 以封装组件或类的 URL 或 SAMPLE。


亲爱的大师,

假设我有这样的代码:

unit unitA;

interface

type
  B = class(TObject)
  public
    procedure HelloB;
  end;

  A = class(TObject)
  public
    function GetB: B;
    function HelloA: String;
    procedure Help;
  end;

  implementation

  uses
      Dialogs;

  { B }

   procedure B.HelloB;
   begin
     ShowMessage('B');
   end;

  { A }

  function A.GetB: B;
  begin
    Result := B.Create;
  end;

  function A.HelloA: String;
  begin
    Result := 'Hello, this is A';
  end;

  procedure A.Help;
  begin
    //do something
  end;

  end.

我想导出A的所有公共方法。如何使其成为DLL?如何使用它从另一个单元导入它?比方说:

 var a: A;

 a := A.Create;
 a.GetB;
 showMessage(a.HelloA);

A 未在单元中声明(它在 DLL 中)。请指教。


欢呼。我昨晚收到了。我所要做的就是使对象实现一个接口,该接口在调用者单元中用于捕获 DLL 返回的对象实例。

谢谢你们。

4

6 回答 6

4

Mason 已经搞定了,但让我详细说明为什么 BPL 不是您想要的。BPL 是 Delphi IDE 加载共享相同内存管理器和 RTL 的组件的一种方式。(类型标识使用 BPL 几乎可以透明地工作)

但是,您所依赖的依赖项几乎总是不可接受的。除了 IDE,它无论如何都不能处理不同版本的 RTL 和 VCL。

当您只在应用程序及其 DLL 之间传递接口引用时,您根本不必共享 RTL、VCL 或共享包。

这也意味着您可以用另一种语言(C++、C#、FPC、另一个 Delphi 版本)编写一些 DLL,并且仍然使用对象。当您不想移植主应用程序但仍想使用 Delphi 或您的 Delphi 版本不可用的现有库时,这可能很诱人。

于 2009-11-10T01:07:30.160 回答
2

将类放在外部文件中的问题是您的主应用程序需要知道某种方式来引用它。它要么必须从将您需要的所有方法公开为虚拟方法的基类继承下来,要么实现一个包含您需要的所有功能的接口。

如果您已经知道对象的接口应该是什么样子,并且您要更改的只是实现细节,例如内部算法,那么最简单的方法可能是让您的类实现一个接口并将其放入导出一个 DLL 的返回此接口实例的函数。这样你就不必担心将你的应用程序分解成包,这可能是一个真正的麻烦。

于 2009-11-09T11:51:38.663 回答
2

我在您的问题描述中没有看到任何内容表明您需要从包中显式导出任何内容,或者您​​需要在运行时动态加载它。相反,您的函数驻留在一个运行时包中就足够了,该包可以与主程序分开替换。

启动一个新的包项目并将您的班级单元连同它所依赖的任何其他单元一起移到该项目中。编译项目。如果编译器警告“隐式包含”任何其他单元,也将它们添加到包中。

现在,从 EXE 项目中删除任何包单元。不应有任何单位同时是这两个项目的成员。接下来,打开 EXE 项目选项中的“使用运行时包构建”复选框。将您的包添加到以分号分隔的包名称列表中。RTL 和 VCL 包也可能在该列表中。

编译这两个项目,你就完成了。

如果您对类实现进行更改,则只能重新编译包并将新版本发送给客户。当您用新文件替换原始文件时,程序将自动获取新的更改。该包在程序的导入表中列出,因此操作系统在加载 EXE 时会自动加载 BPL 文件。EXE 不需要运行任何特殊代码来加载包。

于 2009-11-09T15:01:05.263 回答
0

Delphi 可以创建 DLL 来导出函数或 BPL 来导出组件。

您可以创建组件,编译它(使用与主应用程序相同的编译器设置),Delphi 将创建 .bpl。然后将此组件导入 Delphi 并使用此组件作为包编译您的应用程序。

我使用 Delphi 4 创建的组件的经验证明,一个大型应用程序比具有单独 .bpls 的应用程序更可靠。它是多线程服务器,如果独立编译它可以正常工作,但如果使用包编译,它会在短时间内崩溃。我希望新版本的 Delphi 在这方面有所改进。

注意内存管理(在应用程序中不要释放包中分配的内存,反之亦然)和编译器设置。

如果您喜欢 about.com,那么此链接将很有用:包简介;BPL 是特殊的 DLL!

于 2009-11-09T11:43:16.187 回答
0

BPL 有其用途。例如,如果您必须制作像 Erp 这样非常庞大的应用程序,您需要尝试认真使用 BPL。

另一方面,BPL 不负责崩溃应用程序。对 BPL 的不当使用可以做到这一点。

于 2009-11-09T14:11:19.037 回答
0

您可以尝试使用 MAF 组件,它们无需额外代码即可为您处理插件等等。附带教程和带有源代码的演示应用程序。

http://www.maf-components.com

于 2009-11-26T23:01:23.280 回答