2013-04-30 71 views
2

在將現有的單片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的正確方法是什麼?

回答

3

您應該創建自己的運行時包而不是普通的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