動態鏈接庫是一個能夠被應用程序和其它的DLL調用的過程和函數的集合體它裡面包含的是公共代碼或資源由於DLL代碼使用了內存共享技術在某些地方windows也給了DLL一些更高的權限因而DLL中可以實現一些一般程序所不能實現的功能如實現windows的HOOKISAPI等同時DLL還為不同語言間代碼共享提供了一條方便的途徑因而DLL在編程時應用較為廣泛本文將介紹如何在 Delphi 中建立和使用DLL
一DLL 庫內存共享機制
從使用效果看DLL和unit 很像它們都可以被別的工程模塊所調用但二者在內部的實現機制上確存在著差別如果一個程序模塊中用uses語句引用了某個unit編譯程序在編譯該模塊時便會連同unit一起編譯並把編譯後的可執行代碼鏈接到本程序模塊中這就是一個程序模塊能夠調用所引用unit中過程和函數的原因當同一個unit被多個工程所引用時則每個工程中都含有該unit的可執行代碼當含有該unit的多個工程同時執行時unit的可執行代碼會隨不同工程而多次被調入內存造成內存資源的浪費DLL則不同它即使被某個工程調用編譯後仍是獨立的也就是說編譯後一個DLL庫形成一個單獨的可執行文件而不與任何其它的可執行文件連接在一起因而DLL庫並不從屬於某個特定的工程當多個工程調用同一個DLL庫時只有第一個工程把DLL庫調入內存其余工程並不重復調入同一個DLL庫到內存而是到同一個共享內存區讀取並且DLL的執行代碼是在程序運行期間動態調入的而不是如unit在程序運行時就與整個工程一起調入內存這樣便可消除unit帶來的相同代碼多處占用內存的弊病
二 Delphi中DLL庫的建立
在Delphi環境中編寫一個DLL同編寫一個一般的應用程序並沒有太大的區別事實上作為DLL主體的DLL函數的編寫除了在內存資源的管理上有所不同外並不需要其它特別的手段
一般工程文件的格式為
program 工程標題;
uses 子句;
程序體
而DLLs工程文件的格式為
library 工程標題;
uses 子句;
exprots 子句;
程序體
它們主要的區別有兩點
一般工程文件的頭標用program關鍵字而DLL工程文件頭標用library 關鍵字不同的關鍵字通知編譯器生成不同的可執行文件用program關鍵字生成的是exe文件而用library關鍵字生成的是dll文件;
假如DLL要輸出供其它應用程序使用的函數或過程則必須將這些函數或過程列在exports子句中而這些函數或過程本身必須用export編譯指令進行編譯
在Delphi主菜單file 中選new項在彈出的窗口中雙擊DLL圖標便會自動給出DLL源模塊框架如下
以下是引用片段
Library project;
{注釋}
uses
SysUtils Classes;
begin
end
接下來便可在USES和begin之間加入想在該DLL中實現的過程和函數的定義並用export和exprots保字把它們引出以便別的模塊引用在begin和end之間加入初始化代碼初始化代碼是用來對DLL變量初始化的應注意即便無初始化代碼begin與end也不可省略如下例:
以下是引用片段
library minmax;
function Min(X Y: Integer): Integer; export;
begin
if X < Y then Min := X else Min := Y;
end;
function Max(X Y: Integer): Integer; export;
begin
if X > Y then Max := X else Max := Y;
end;
exports
Min index
Max index ;
egin
end
經編譯後並以minmaxDLL存盤後一個DLL庫文件便形成了
delphi 中動態鏈接庫(dll)的建立和使用 來自: 免費論文網
[] []
From:http://tw.wingwit.com/Article/program/Delphi/201311/25064.html