TApplication并将C++ Builder应用程序拆分为DLL

问题描述:

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

的DLL项目和EXE项目已经启用了以下选项,所以他们应该都共享内存管理器和VCL库:

  • 链接与动态RTL
  • 与德尔福运行时库
  • 链接
  • 链接运行时包

从我所了解的情况来看,这些选项是需要的问题,如内存分配和VCL组件操作跨越DLL边界。

事情大多数工作。然而,全球TApplication的实例显然是从DLL中的一个中被初始化,而不是从exe文件内,有几个不想要的结果:

  • 系统:IsLibrary被错误地设置为true。
  • 应用程序 - >图标未设置。
  • 应用程序 - >手柄未设置。
  • 因为应用程序 - >拉手未设置,各种其他的问题就出来了:快捷键不工作,有与线程同步问题等

我可以通过设置应用程序 - 解决这些问题> Icon->从WinMain处理和调用Application-> CreateHandle,但我不确定这是否是正确的解决方案(特别是因为the docs说“不要调用CreateHandle”)。

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

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

+0

谢谢。这类作品,但它似乎没有与C++代码良好玩。程序包中的模板在程序包外部是不可见的,即使标准要求成员常量定义,编译器也会拒绝成员常量定义,内联函数很奇怪,链接程序不能找到带有额外点的源文件名,跨平台的C++文件必须标记为与Delphi兼容的单元......除非有简单的解决方案,否则这些问题似乎比我开始的时候更糟糕。 – 2013-05-01 19:41:59

+0

@JoshKelley:我还没有用过C++的包,但是我已经尝试过了,我没有看到很多这些问题。它们只是一种特殊的DLL。内联:嗯,你会希望DLL也有麻烦。会员常量......奇怪......你能举个例子吗?德尔福兼容单位,你是什么意思,用declspec?我建议的是对这些问题提出一个单独的问题,或者对每个问题提出一个问题。软件包肯定是由C++ Builder正式支持的,所以你可能比已知存在问题的某些东西(DLL)有更多的运气。 – 2013-05-02 07:38:23

+1

继续:TApplication不是使用DLL时唯一会遇到的问题 - 整个Delphi类型系统和从它降序的所有类都会有相同的问题,因为每个DLL都有自己的副本。 “在共享VCL组件时,软件包对于您的需求至关重要”。 – 2013-05-02 07:39:38