Delphi中動態鏈結庫兩種呼叫方式的比較

2021-04-18 15:24:53 字數 1458 閱讀 6111

摘要:本文闡述了windows環境下動態鏈結庫的概念和特點,對靜態呼叫和動態呼叫兩種呼叫方式作出了比較,並給出了delphi中應用動態鏈結庫的例項。動態鏈結庫(dynamic link library,縮寫為dll)是乙個可以被其它應用程式共享的程式模組,其中封裝了一些可以被共享的例程和資源。動態鏈結庫檔案的副檔名一般是dll,也有可能是drv、sys和fon,它和可執行檔案(exe)非常類似,區別在於dll中雖然包含了可執行**卻不能單獨執行,而應由windows應用程式直接或間接呼叫。

動態鏈結是相對於靜態鏈結而言的。所謂靜態鏈結是指把要呼叫的函式或者過程鏈結到可執行檔案中,成為可執行檔案的一部分。換句話說,函式和過程的**就在程式的exe檔案中,該檔案包含了執行時所需的全部**。當多個程式都呼叫相同函式時,記憶體中就會存在這個函式的多個拷貝,這樣就浪費了寶貴的記憶體資源。而動態鏈結所呼叫的函式**並沒有被拷貝到應用程式的可執行檔案中去,而是僅僅在其中加入了所呼叫函式的描述資訊(往往是一些重定位資訊)。僅當應用程式被裝入記憶體開始執行時,在windows的管理下,才在應用程式與相應的dll之間建立鏈結關係。當要執行所呼叫dll中的函式時,根據鏈結產生的重定位資訊,windows才轉去執行dll中相應的函式**。

一般情況下,如果乙個應用程式使用了動態鏈結庫,win32系統保證記憶體中只有dll的乙份複製品,這是通過記憶體對映檔案實現的。dll首先被調入win32系統的全域性堆疊,然後對映到呼叫這個dll的程序位址空間。在win32系統中,每個程序擁有自己的32位線性位址空間,如果乙個dll被多個程序呼叫,每個程序都會收到該dll的乙份映像。與16位windows不同,在win32中dll可以看作是每個程序自己的**。

1. 共享**、資源和資料

使用dll的主要目的就是為了共享**,dll的**可以被所有的windows應用程式共享。

2. 隱藏實現的細節

dll中的例程可以被應用程式訪問,而應用程式並不知道這些例程的細節。

3. 拓展開發工具如delphi的功能

由於dll是與語言無關的,因此可以建立乙個dll,被c++、vb或任何支援動態鏈結庫的語言呼叫。這樣如果一種語言存在不足,就可以通過訪問另一種語言建立的dll來彌補。

1. load-time dynamic linking

這種用法的前提是在編譯之前已經明確知道要呼叫dll中的哪幾個函式,編譯時在目標檔案中只保留必要的鏈結資訊,而不含dll函式的**;當程式執行時,利用鏈結資訊載入dll函式**並在記憶體中將其鏈結入呼叫程式的執行空間中,其主要目的是便於**共享。

2. run-time dynamic linking 

這種方式是指在編譯之前並不知道將會呼叫哪些dll函式,完全是在執行過程中根據需要決定應呼叫哪個函式,並用loadlibrary和getprocaddress動態獲得dll函式的入口位址。

由於動態鏈結庫可以實現**和資源的共享,大大減少系統資源的占用,因此在當今的應用程式開發中起著非常重要的作用。delphi是現今流行的應用軟體開發工具,本文就如何在delphi中使用動態鏈結庫給出了一定程度上的闡述。

動態鏈結庫的兩種方式

呼叫乙個dll中的函式有兩種方法 1 載入時動態鏈結 load time dynamic linking 模組非常明確自己要呼叫哪些匯出函式,使得它們就像本地函式一樣。要達到如此,需要鏈結時鏈結那些匯出函式所在dll的導入庫,導入庫向系統提供了載入dll時所需的資訊 庫的符號鏈結之類 及dll函式定...

動態鏈結庫的兩種方式

呼叫乙個dll中的函式有兩種方法 1 載入時動態鏈結 load time dynamic linking 模組非常明確自己要呼叫哪些匯出函式,使得它們就像本地函式一樣。要達到如此,需要鏈結時鏈結那些匯出函式所在dll的導入庫,導入庫向系統提供了載入dll時所需的資訊 庫的符號鏈結之類 及dll函式定...

DELPHI 中動態鏈結庫的使用

在delphi中,有兩種方法可用於呼叫乙個儲存在dll 動態鏈結庫 中的過程。一 呼叫方法 1 靜態呼叫或顯式裝載使用乙個外部宣告子句,使dll在應用程式開始執行前即被裝入。例如 function instring sourcestr pchar check char integer far ext...