第 10 章
以 Delphi 寫作與使用 DLL
Delphi Package
從這一節起,我將介紹 Delphi 3 起新增特性中的 Package。為什麼將 Package 放在這一章 呢?那是因為 Package 也是一種 DLL。一般人對於 Package 的第一個印象是它可以讓 EXE 檔變小,的確如此,不過它能做的不只是這樣而已,我們也拿它來切割應用程式。事實上, Package 保留了「將程式碼分離出來由兩個以上的 EXE 共享」的優點,但是在設計與使用 時卻又完全像是從來沒有分開過一樣。
什麼是 Package?
1 Package 是什麼?簡單來說,它是專為 Delphi 量身訂製的特殊 DLL ,內含 VCL 的元件以 及其他的函式與變數。 一切還是得從單元談起,過去到現在,單元(Unit)始終是 Delphi 模組化程式的基礎, *.PAS 在編譯之後變成 *.DCU,然後再編譯進 EXE 可執行檔中。情形從 Delphi 3 開始有 些改變...,現在,當我們編譯連結時,可以選擇:不要將已經在 Package 中的程式編 譯進 EXE。換句話說,現在我們可以預先將一些單元合併製作成副檔名為 .DPL 的所謂 Package,然後告訴 Delphi:凡是在 Package 中有的東西,都不用編譯進.EXE 檔,等到執 行時,再將 Package 裏頭的東西拿出來與 EXE 一起工作。 因此,所有應用到 Package 的檔案,其 EXE 檔的大小都很明顯地變小。為什麼?因為這 些程式碼現在大部分都在 .DPL 中。我們來親身體驗看看吧! 1. 【File / New Application】開始一個新的專案。
1
與 Delphi 同為一家公司所研發的 C++Builder ,自 3.0 版起,也開始支援 Package,副檔
名為 .BPL。
583
第二篇
SDK 基礎與 VCL
2. 【File / Save All】將專案找一個
工作目錄存起來,檔名都按預設的 Unit1.pas、 Project1.dpr,沒有關係。 3. 【Project / Build All Projects】 編譯這個程式,從 「檔案管理員」 你可觀察到 Project1.exe 這個檔案大約是 175K 左右。 4. 【Project / Options…】,將 Package 這頁的「Build with runtime packages」Checkbox 打 上勾勾,然後點「Ok」按鈕結束。 5. 【Project / Build All Projects】 重新編譯 會發現: , 現在 Project1.exe 大幅縮小 不到 10K。 , 為什麼?因為 Inprise 為 Delphi 的 VCL 提供了一組 .DPL 檔案,其中已經含有 Delphi 出貨 時 VCL 完整的程式碼了,我們寫作程式時,這些 VCL 的程式碼過去是一再複製到我們 的 .EXE 檔,現在,不過是將這些程式碼獨立出來另外放而已。不過,雖說 EXE 檔變小 了,在它執行時,仍然需要這些 .DPL 的幫忙才能執行。 「這跟 Visual Basic 的
VBRUNxxx.DLL 是一樣的嘛!」嗯!很像,但不完全是那樣。首 先,程式仍是編譯式的,並非 Visual Basic 直譯式的作法,依然維持很高的執行效率;其 次,我們應該視 Package 是一種新的編譯技術,它很適合
用來切割應用程式。 為何這麼說呢?還記得我們在上一節用了比較曲折的方式輸出物件嗎?還記得之前提到
Delphi 的 DLL 不能輸出變數嗎?現在我要告訴你,應用 Package,這些都不是問題了。因 為你現在可以將 Package 裏頭的單元就當成一般以 uses 使用的單元那樣,可以直接參考它 2 interface 中的東西,差別在於:這些東西在編譯時,由 Compiler 決定 要不要出現在 EXE 檔中。
2
當然啦!Compiler 會怎麼決定,還是要看專案的設定,因此,這句話若說成:「要不要
用 Package 是我們決定的」,也是可以的。
584
第 10 章
以 Delphi 寫作與使用 DLL
製作 Package
接下來,我還是透過實例來說明如何製作與使用 Package。 1. 【File / New Application】開始一個新的專案 2. 將 Form1 的 Name 屬性改成 frmAnimate,然後從元件盤的 Win32 標籤選擇 TAnimate 元件放一個到 Form 裏頭並改名為 anmtFindFile 3. 【File / Save All】將這個專案存檔,單元檔名:AniU.pas,專案檔名:Ani.dpr。同樣 的,我仍然建議你找一個特定的目錄存放,稍候實驗作完時比較方便刪除 Package 的 相關檔