【发布时间】:2016-05-05 07:02:58
【问题描述】:
我想开发带有插件的 GUI 应用程序。插件包含从 Plugin-Core 库中的 Base Forms 继承的 VCL Forms。主应用可以选择动态加载哪个插件,然后显示哪个Form子类。
在用户端,我想部署主要的.EXE,Plugin-Core 库,以及针对不同模型的许多插件库。我可以向用户发布新的或修改现有的插件库,以便为新设备显示新的表单,而无需修改主 .EXE 和 Plugin-Core 库。
我开发的第一个版本使用 DLL 的方式,即 Plugin-Core 库和插件都是 DLL 的形式。在用户方面一切都很好。但是,在开发人员方面,如果没有在 Plugin-Core DLL 项目中定义的 Base Forms,则无法链接插件 DLL 项目。这意味着Base Forms实际上是静态链接在每个插件DLL项目中的,如果有一天我修改了Base Forms并重新构建Plugin-Core DLL项目,我必须重新构建所有插件DLL项目并重新发布插件.DLL 也适用于用户。
在StackOverflow中搜索和询问后,我意识到VCL Forms不能跨DLL边界继承的限制是由于RTTI冲突(?)。建议的解决方案是将库从 DLL 修改为 BPL 形式,这是我开发的第二个版本。除了以下两个之外,一切都很好:
从插件 BPL 动态加载的表单与 Windows 任务栏中的主 .EXE 分离。这不是我想要的。解决方案是我在 .EXE 项目中启用了“使用运行时包构建”。
在 .EXE 项目中启用“使用运行时包构建”后,我必须向用户发布其他 .BPL,例如 vcl.bpl 和 rtl.bpl。这不是我想要的。
我想知道以上两个问题可以同时解决吗?在我看来,如果我能解决这两个问题:
- 在 .EXE 项目中禁用“使用运行时包构建”。
- 在所有 .BPL 项目中启用“使用运行时包构建”。
这样.EXE可以在没有vcl.bpl和rtl.bpl 捆绑,并且插件 .BPL 可以成功加载,因为依赖单元已经是主 的一部分>.EXE?我对么?但是,所有 .BPL 项目选项中都禁用了“使用运行时包构建”复选框。结果,我没有机会检查解决方案是否有效。对于冗长的描述,我很抱歉,由于公司的互联网安全政策,我无法附上图片。
【问题讨论】:
标签: plugins bpl c++builder-2009