2

在采用现有的单体 C++Builder VCL 应用程序并将其拆分为 exe + DLL 时,我遇到了 TApplication 的问题。

DLL 项目和 exe 项目启用了以下选项,因此它们都应该共享内存管理器和 VCL 库:

  • 与动态 RTL 链接
  • 与 Delphi 运行时库链接
  • 与运行时包链接

据我了解,内存分配和 VCL 组件操作等问题需要这些选项才能跨 DLL 边界工作。

事情大部分都在工作。但是,全局 TApplication 实例显然是从其中一个 DLL 中初始化的,而不是从 exe 中初始化的,这会产生一些不需要的结果:

  • System::IsLibrary 被错误地设置为 true。
  • 应用程序-> 图标未设置。
  • 应用程序-> 句柄未设置。
  • 因为没有设置Application->Handle,所以出现了其他各种问题:快捷键不起作用,线程同步有问题等等。

我可以通过设置 Application->Icon->Handle 并从 WinMain 调用 Application->CreateHandle 来解决这些问题,但我不确定这是正确的解决方案(特别是因为文档说“不要调用 CreateHandle”)。

在共享 VCL 组件的同时将 C++Builder VCL 应用程序拆分为 DLL 的正确方法是什么?

4

2 回答 2

3

您应该创建自己的运行时包而不是普通的 DLL。包是一种特殊类型的 DLL,它具有内置的 RTL/VCL 支持。

于 2013-05-01T01:41:56.850 回答
-1

我们通过使用延迟加载 Dll 解决了问题(它可以在 exe 项目 c++ 链接器属性中找到)。

更多信息: 延迟加载 DLL

于 2018-11-06T10:22:55.407 回答