簡體   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