Ez DLL Pack v1.4(試用版)

Copyright(c) 2002 EZ Studio

1.0 簡介

此框架可協助您建立一個可動態抽換模組的應用程式架構,主要是將 Delphi Form 包在 DLL 中的技術。可抽換模組有許多優點,包括:

若欲了解更多相關細節與基礎設計理念,您也可以參考拙作「DLL 應用 - 設計可抽換的模組」。此框架其實是這篇文章的延伸,經過改良及強化,降低了程式撰寫的複雜度,亦使它能應用於更多種場合,包括 Modal、Modeless 視窗,以及 MDI 子視窗。

此框架已應用於多個實際專案,您可以以此作為一個通用架構的基礎,在其上發展出適合您需要的功能。

2.0 規格與功能清單

3.0 安裝(試用版)

請依照下列步驟安裝套件(其中 '#' 符號代表 Delphi 版本號碼,閱讀時請自行替換成您的 Delphi 版本號碼):

  1. 如果之前已經有安裝舊的版本,請先將套件從 Delphi IDE 中移除,並刪除舊版的檔案。
  2. 將壓縮檔解開至您要安裝的目錄下,以下假設您欲將套件安裝到 'C:\Lib\EzDllPackTrial\'。
  3. 將 'C:\Lib\EzDllPackTrial\D#\EzDll#.BPL' 複製到 Delphi 的 Projects\BPL\ 
    目錄下(注意:不需要複製 DclEzDll*.bpl 和 .dcp 檔案)。
  4. 開啟 Delphi,點選 Component | Install Packages,按一下 'Add' 鈕,根據你的 Delphi 版本選擇檔案 'C:\Lib\EzDllPackTrial\D#\DclEzDll#.bpl',選好之後按 Ok 鈕。
  5. 將 'C:\Lib\EzDllPackTrial\D#' 加入環境設定的 'Library path'(如果 Delphi 已經自動幫你加入路徑就可略過此步驟)。
  6. 將 EzDllForm 加入物件寶庫。做法為點選 File | Open,開啟 'C:Lib\EzDllPack\Source\EzDllFm.pas',在 form 上面點一下滑鼠右鍵,選 'Add to repository...',接著 Title 欄輸入 'Ez DLL Form',Page 欄選擇 'Forms'(或者您也可以放在新建立的頁夾),然後按 Ok 鈕。

安裝完成後,Delphi 元件盤上會增加一個頁夾 'EzTools',物件寶庫裡則多了一個 EzDllForm,現在你可以開啟範例程式學習如何使用這個套件。

4.0 入門教學

以下以一個簡單的範例,說明如何使用此框架建立可抽換模組的應用程式:

4.1 建立主程式

  1. New 一個 Application。
  2. 確定專案選項的 "Build with runtime packages 有打勾
  3. 將 Form 的 Name 改為 MainForm,儲存所有檔案,form 單元命名為 'MainFm.pas',專案命名為 'Ex1.dpr。
  4. 參考(Uses)EzDllUtils 單元。
  5. 在 MainForm 上面放一個 TButton,並在其 OnClick 事件中撰寫程式碼如下:

    procedure TMainForm.Button1Click(Sender: TObject);
    begin
      DllShowModalForm(Handle, 'MyPlugin.DLL', 'TMyPluginForm', 'Hello!');
    end;
    
  6. 儲存,並且編譯連結。

4.2 建立 plugin DLL

  1. 建立一個 DLL 專案(File | New,選擇 DLL,然後按 Ok 鈕)。確定專案選項的 "Build with runtime packages 有打勾,然後儲存專案,專案命名為 'MyPlugin.dpr'。
  2. File | New,切到 Forms 頁夾,選擇 EzDllForm,使用方式選擇 "Inherit",然後按 Ok 鈕。
  3. 將新建立的 form 的 Name 改為 'MyPluginForm',儲存此單元,檔案命名為 'MyPluginFm.pas'。
  4. Uses EzDllExport 單元,並且在 MyPluginFm 單元的 initialization 區段中註冊類別,程式碼如下:

    uses EzDllExport;
    
    initialization
      PluginFactory.RegisterClass(TMyPluginForm);
    
  5. 在 form 上面放一個 TEzDllFormEvents 元件,在其 OnInitialization 事件中撰寫程式碼如下:

    procedure TMyPluginForm.EzDllFormEvents1Initialize(Sender: TObject;
      const AParam: String);
    begin
      inherited;
      ShowMessage('正在初始化視窗,主程式傳入的參數值為:' + QuotedStr(AParam));
    end;
    
  6. 點選 IDE 主選單的 Run | Parameters,'Host Application' 輸入 'Ex1.exe',然後 Save all,執行。

注意主程式和 Plugin DLL 專案是存放在同一個目錄下,這是為了便於示範,實際開發時通常會分別放在不同的目錄。

5.0 程式檔案

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),在多個行程之間共享資料。

6.0 範例程式

範例程式均以 Delphi 5 撰寫而成,如果你的 Delphi 版本是 Delphi 6 或更新的版本,請在編譯範例程式之前重新抓取專案選項中的 runtime packages,方能順利編譯。

Ex1

展示如何將 Form 包在 DLL 裡面,以及主程式如何傳遞參數給 DLL form。開啟 BuildEx1.bpg,執行時,你的環境必須要有 'DBDEMOS' 資料庫別名。

MDI

此範例展示了:

請開啟 BuildAll.bpg 進行編譯。程式相關說明請閱讀 MainFm.pas 的檔頭註解。

SharedMem

展示如何使用 TEzSharedMemory 元件讓不同的行程間可以共享資訊。

開啟 SharedMemDemo.bpg,先執行 Project1.exe,按一下 'Create' 鈕,然後按 'Write data',再按 'Run Project2',Projet2.exe 開啟之後,按 'Open',再按 'Read data',你就可以看到由 Project1 寫入的共享資料被 Project2 讀出。同樣地,你也可以在 Project2 裡面修改資料,寫回共享記憶體,再由 Project1 讀出。