繁体   English   中英

如何仅部署 .EXE 和自定义 .BPL 文件?

[英]How to deploy ONLY .EXE and custom .BPL files?

我想用插件开发 GUI 应用程序。 插件包含从 Plugin-Core 库中的 Base Forms 继承的 VCL Forms。 主应用可以选择动态加载哪个插件,然后显示哪个Form子类。

在用户端,我想部署主.EXE 、插件核心库和许多不同模型的插件库。 我可以向用户发布新的或修改现有的插件库以显示新设备的新表单,而无需修改主.EXE和插件核心库。

我开发的第一个版本使用 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 形式,这是我开发的第二个版本。 除了以下两个之外,一切都很好:

  1. 从插件 BPL 动态加载的 Form 与 Windows 任务栏中的主.EXE分开。 这不是我想要的。 解决方案是我在.EXE项目中启用了“使用运行时包构建”。

  2. .EXE项目中启用“使用运行时包构建”后,我必须向用户发布其他 .BPL,例如vcl.bplrtl.bpl 这不是我想要的。

请问以上两个问题可以同时解决吗? 在我看来,如果我能解决这两个问题:

  1. .EXE项目中禁用“使用运行时包构建”。
  2. 在所有.BPL项目中启用“使用运行时包构建”。

这样, .EXE可以在没有vcl.bplrtl.bpl捆绑的情况下运行,并且插件.BPL可以成功加载,因为依赖单元已经是主.EXE 的一部分? 我对么? 但是,所有.BPL项目选项中都禁用了“使用运行时包构建”复选框。 因此,我没有机会检查解决方案是否有效。 对于冗长的描述,我很抱歉,由于公司的互联网安全政策,我无法附上图片。

从插件 BPL 动态加载的 Form 与 Windows 任务栏中的主 .EXE 分开。 这不是我想要的。 解决方案是我在 .EXE 项目中启用了“使用运行时包构建”。

加载 BPL 后,将 EXE 的Application.Handle传递给 BPL 并将其分配给 BPL 自己的Application.Handle然后再创建任何 Form 实例。

或者,在 Windows 7+ 上,您可以让 EXE 调用SetCurrentProcessExplicitAppUserModelID()为其任务栏按钮建立应用 ID。 然后 BPL 中的每个 Form 都可以使用SHGetPropertyStoreForWindow()IPropertyStore.SetValue(PKEY_AppUserModel_ID)为其窗口设置相同的 App ID。 具有相同 App ID 的多个窗口组合在一个任务栏按钮下。

有关更多详细信息,请参阅 MSDN: 应用程序用户模型 ID (AppUserModelIDs)

请问以上两个问题可以同时解决吗? 在我看来,如果我能解决这两个问题:

  1. 在 .EXE 项目中禁用“使用运行时包构建”。

  2. 在所有 .BPL 项目中启用“使用运行时包构建”。

这样,.EXE 可以在没有 vcl.bpl 和 rtl.bpl 捆绑的情况下运行,并且插件 .BPL 可以成功加载,因为依赖单元已经是主 .EXE 的一部分? 我对么?

不可以。BPL 不能像那样使用 EXE 的内置单元。

如果禁用“Build with Runtime Packages”,RTL/VCL 单元将静态链接到可执行文件中。 这样做的问题是给定单元的多个副本不能同时加载到内存中,因此如果相同的 RTL/VCL 单元静态链接,您将无法一起加载多个 BPL(甚至根本无法加载)成多个 BPL,甚至是 EXE 本身。

如果启用“使用运行时包构建”,则可执行文件将依赖于 RTL/VCL BPL,然后必须部署这些 BPL。

因此,如果您的 EXE 和 BPL 共享公共单元,则这些单元必须通过共享 BPL 加载,因此内存中仅存在单元的一个副本。 在编写自定义 BPL 时无法避免这一点。 这意味着如果您使用基本的 RTL 功能,通常至少需要部署 RTL.BPL,以及用于 UI 的 VCL.BPL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM