[QPlugins] BPL 还是 DLL 插件,我该如何选择?

我们用 Delphi 或 C++ Builder 编写插件时,许多人会在 DLL 和 BPL 插件之间纠结,那么我们应该如何看待此问题呢?

首先我们来看它们的优势:

  • BPL 插件
    Delphi / C++ Builder 原生支持,通过在主程序和插件中引用同样的包,可以达到可以传递相同对象的目的,而且动态转换类型时,不会由于类型的信息的运行时不正确而无法转换。同样的,也就不会有 DLL 中窗口的诸多问题。
  • DLL 插件
    几乎受各种 Windows 平台下的编程语言支持,使用 DLL 插件意味着我们不需要限定编译环境,甚至可以调用 VC 编写的各类插件。

再看看它们的劣势:

  • BPL 插件
    BPL 插件的劣势是限制了编程环境,你只能使用 C++ Builder / Delphi 编译,并且要求插件和主程序必需共享同一套运行时 BPL,否则,同一名称的类型信息由于分布在不同的 BPL 中,你试图判断子类是否是某个父类时,会呈现错误的结果,如一个 VCL 程序至少要引入有共同的 vcl 和 rtl ,否则你试图在主程序中判断插件中的某个控件是否是 TComponent 等操作时就会得到错误的结果。还有一个问题是,由于不用版本的 Delphi /C++ Builder 对底层的类库会有不断的修正和改进,所以理论上,你还必需是用同一版本的 Delphi/C++ Builder 来编译主程序和插件。
  • DLL 插件
    DLL 插件的劣势首先是体积会比 BPL 的更大,而且由于类型的运行时各自分布在不同的 DLL 中,所以你不能通过 as / dynamic_cast 等方法进行类型转换。同时,DLL 插件由于有自己完整的一套类型和单元初始化信息,所以如 Application 这种全局变量,会在不同的插件和主程序中存在一份独立的副本,你需要自己去处理很多问题,以解决控件的焦点等各种在 BPL 中不存在的问题。

好了,接下来取舍的建议:

  • 如果不考虑跨语言编程,那么 BPL 应该是最好的选择;
  • 如果考虑跨语言编程,那么 DLL 应该是更好的选择;
  • 当然,更好的选择是两个都支持,根据不同的需要来选择不同的模式,只是多加一个加载器而已。

上面的建议,只是一个参考, QPlugins 不试图去限制你的思维,你可以做 N 多选择,只要能够提供需要的服务,DLL 又如何,BPL 又如何?脚本我们都可以当成一种选择!

分享到: