【问题标题】:TApplication and splitting a C++Builder application into DLLsTApplication 并将 C++Builder 应用程序拆分为 DLL
【发布时间】:2013-04-24 22:11:00
【问题描述】:

在将现有的单体 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 来解决这些问题,但我不确定这是正确的解决方案(尤其是因为 the docs 说“不要调用创建句柄”)。

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

【问题讨论】:

    标签: dll c++builder vcl


    【解决方案1】:

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

    更多信息在这里: Delay Loading DLLs

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢。这种工作,但它似乎不能很好地与 C++ 代码一起使用。包中的模板在包外不可见,编译器拒绝成员常量定义,即使它们是标准要求的,内联函数很奇怪,链接器无法找到带有额外点的源文件名,必须将跨平台 C++ 文件标记为与 Delphi 兼容的单元……除非所有这些问题都有简单的解决方案,否则这些问题似乎比我开始时遇到的问题更严重。
      • @JoshKelley:我使用 C++ 的包不多,但我已经尝试过,我没有看到很多这样的问题。它们只是一种特殊的 DLL。内联:嗯,你会认为 DLL 也会有麻烦。成员常量......奇怪......你能举个例子吗? Delphi 兼容的单元,你是什么意思,带有 declspec?我的建议是针对这些问题提出一个单独的问题,或者对每个单独的问题提出一个问题。包肯定受到 C++ Builder 的官方支持,所以你可能会比已知有问题的东西(DLL)更幸运。
      • 继续:TApplication 并不是唯一一个使用 DLL 时会遇到问题的东西 - 整个 Delphi 类型系统和所有从它派生的类都会有同样的问题,因为每个 DLL 都有自己的自己的副本。包对于您“在共享 VCL 组件时”的要求是必不可少的。
      • @DavidM - 除非我遗漏了什么,否则使用运行时包和动态 RTL 可以避免“每个 DLL 都有自己的副本”问题,因为它们都共享同一个动态加载的副本。我将尝试整理一个后续问题,其中包含有关我在包中看到的问题的更多详细信息,尽管我开始没有时间花在这些问题上。
      • @JoshKelley 是的,我就是这个意思。抱歉,如果不清楚。这是使用包的主要原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 2011-04-14
      • 2017-07-09
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多