delphi DLL動態鏈結庫

2021-09-20 20:37:39 字數 1304 閱讀 3674

假設有兩個應用程式,它們都要呼叫乙個單元中的乙個方法,那麼這兩個應用程式都要在uses語句中引用該單元。如果同時執行這兩個應用程式,這個方法就會在記憶體中存在兩份,這顯然是記憶體的一種浪費,使用動態鏈結庫就可以解決這個問題。

動態鏈結庫dll與其他應用程式通過動態鏈結技術來共享**。如果乙個應用程式使用了動態鏈結庫,win32系統保證記憶體中只有dll的乙份複製 品,這是通過記憶體對映檔案實現的。dll首先被調入win32系統的全域性堆疊,然後對映到呼叫這個dll的程序的位址空間,在win32系統中,每個程序 擁有自己的32位線性位址空間。如果乙個dll被多個程序呼叫,每個程序都會收到該dll的乙份對映。在win32中,dll可以看作是每個程序自己的代 碼。但是這並不是說物理記憶體中會分配dll的多個例項。

dll的優點:

(1)       共享**、資源和資料

(2)       隱藏實現的細節

例如我們建立乙個引用dll的例子

(1)   新建――other---dll wizard 命名為:dlltest

(2)   寫乙個加法函式

uses

sysutils,

classes;

function addmethod(num1,num2 : integer) : integer ;stdcall;   //定義簡單加法函式

begin

result := num1 + num2;

end;

exports         //exports 子句用於引出dll中要被其他應用程式呼叫 的函式或過程。

addmethod;

(3)   生成dlltest.dll, 複製dlltest.dll將其放在要引用該dll專案工程下。

(4)   var

form10: tform10;

function addmethod(num1,num2 : integer) : integer ;stdcall; external 'dlltest.dll'  //宣告dll方法

name 'addmethod';

implementation

procedure tform10.btnequalclick(sender: tobject);

varnum1, num2 : integer;

begin

num1 := strtoint(edtfirst.text );

num2 :=strtoint(edtsecond.text );

edtresult.text :=inttostr(addmethod(num1,num2));  //直接使用dll中的方法

end;

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...