Copyright(c) 2002 EZ Studio
此框架可協助您建立一個可動態抽換模組的應用程式架構,主要是將 Delphi Form 包在 DLL 中的技術。可抽換模組有許多優點,包括:
- 應用程式部署的組態更加彈性(例如:有些模組僅包裝於某種版本中)。
- 減少應用程式每次更新版本的檔案大小。
- 有利於明確劃分小組成員的權責。
- 有效地降低單一程式的複雜度,程式較易於維護。
若欲了解更多相關細節與基礎設計理念,您也可以參考拙作「DLL 應用 - 設計可抽換的模組」。此框架其實是這篇文章的延伸,經過改良及強化,降低了程式撰寫的複雜度,亦使它能應用於更多種場合,包括 Modal、Modeless 視窗,以及 MDI 子視窗。
此框架已應用於多個實際專案,您可以以此作為一個通用架構的基礎,在其上發展出適合您需要的功能。
請依照下列步驟安裝套件(其中 '#' 符號代表 Delphi 版本號碼,閱讀時請自行替換成您的 Delphi 版本號碼):
安裝完成後,Delphi 元件盤上會增加一個頁夾 'EzTools',物件寶庫裡則多了一個
EzDllForm,現在你可以開啟範例程式學習如何使用這個套件。
以下以一個簡單的範例,說明如何使用此框架建立可抽換模組的應用程式:
- New 一個 Application。
- 確定專案選項的 "Build with runtime packages 有打勾。
- 將 Form 的 Name 改為 MainForm,儲存所有檔案,form 單元命名為 'MainFm.pas',專案命名為 'Ex1.dpr。
- 參考(Uses)EzDllUtils 單元。
- 在 MainForm 上面放一個 TButton,並在其 OnClick 事件中撰寫程式碼如下:
procedure TMainForm.Button1Click(Sender: TObject); begin DllShowModalForm(Handle, 'MyPlugin.DLL', 'TMyPluginForm', 'Hello!'); end;- 儲存,並且編譯連結。
- 建立一個 DLL 專案(File | New,選擇 DLL,然後按 Ok 鈕)。確定專案選項的 "Build with runtime packages 有打勾,然後儲存專案,專案命名為 'MyPlugin.dpr'。
- File | New,切到 Forms 頁夾,選擇 EzDllForm,使用方式選擇 "Inherit",然後按 Ok 鈕。
- 將新建立的 form 的 Name 改為 'MyPluginForm',儲存此單元,檔案命名為 'MyPluginFm.pas'。
- Uses EzDllExport 單元,並且在 MyPluginFm 單元的 initialization 區段中註冊類別,程式碼如下:
uses EzDllExport; initialization PluginFactory.RegisterClass(TMyPluginForm);- 在 form 上面放一個 TEzDllFormEvents 元件,在其 OnInitialization 事件中撰寫程式碼如下:
procedure TMyPluginForm.EzDllFormEvents1Initialize(Sender: TObject; const AParam: String); begin inherited; ShowMessage('正在初始化視窗,主程式傳入的參數值為:' + QuotedStr(AParam)); end;- 點選 IDE 主選單的 Run | Parameters,'Host Application' 輸入 'Ex1.exe',然後 Save all,執行。
注意主程式和 Plugin DLL 專案是存放在同一個目錄下,這是為了便於示範,實際開發時通常會分別放在不同的目錄。
Ez DLL Pack 的主要組成單元及功能描述:
| 單元名稱 | 功能描述 |
|---|---|
| EzDllFm.pas | 此單元包含一個 TEzDllForm 類別,它提供了 DLL 視窗的基本功能。 |
| EzDllExport.pas | 此單元定義 DLL 的輸出(export)函式,提供 DLL 與外界溝通的介面,其中大部分的工作由 TPlugin 類別負責完成,包括 form 物件的建立、顯示及摧毀等工作。 |
| EzDllUtils.pas | 此單元定義了 IPlugin 介面,並且提供一些工具函式以便管理應用程式載入的 DLLs。 |
| EzDllFmEvt.pas | TEzDllFormEvent 元件,用來攔截 TEzDllForm 的事件,方便以視覺化的方式撰寫事件處理程序。目前只有一個事件,您可以自行擴充其功能以符合實際需求。 |
| EzDllReg.pas | 註冊元件的單元。 |
| EzSharedMem.pas | TEzSharedMemory 元件,讓您可以進行跨行程通訊(IPC),在多個行程之間共享資料。 |
範例程式均以 Delphi 5 撰寫而成,如果你的 Delphi 版本是 Delphi 6 或更新的版本,請在編譯範例程式之前重新抓取專案選項中的 runtime packages,方能順利編譯。
展示如何將 Form 包在 DLL 裡面,以及主程式如何傳遞參數給 DLL form。開啟 BuildEx1.bpg,執行時,你的環境必須要有 'DBDEMOS' 資料庫別名。
此範例展示了:
請開啟 BuildAll.bpg 進行編譯。程式相關說明請閱讀 MainFm.pas 的檔頭註解。
展示如何使用 TEzSharedMemory 元件讓不同的行程間可以共享資訊。
開啟 SharedMemDemo.bpg,先執行 Project1.exe,按一下 'Create' 鈕,然後按
'Write data',再按 'Run Project2',Projet2.exe 開啟之後,按 'Open',再按 'Read data',你就可以看到由 Project1 寫入的共享資料被 Project2 讀出。同樣地,你也可以在 Project2 裡面修改資料,寫回共享記憶體,再由 Project1 讀出。