dll的兩種呼叫方式,lib與dll區別

2021-06-07 13:15:33 字數 1179 閱讀 1145

(1)lib是編譯時需要的,dll是執行時需要的。

如果要完成源**的編譯,有lib就夠了。

如果也使動態連線的程式執行起來,有dll就夠了。

在開發和除錯階段,當然最好都有。

(2)一般的動態庫程式有lib檔案和dll檔案。lib檔案是必須在編譯期就連線到應用程式中的,而dll檔案是執行期才會被呼叫的。如果有dll檔案,那麼對應的lib檔案一般是一些索引資訊,具體的實現在dll檔案中。如果只有lib檔案,那麼這個lib檔案是靜態編譯出來的,索引和實現都在其中。靜態編譯的lib檔案有好處:給使用者安裝時就不需要再掛動態庫了。但也有缺點,就是導致應用程式比較大,而且失去了動態庫的靈活性,在版本公升級時,同時要發布新的應用程式才行。

(3)在動態庫的情況下,有兩個檔案,乙個是引入庫(.lib)檔案,乙個是dll檔案,引入庫檔案包含被dll匯出的函式的名稱和位置,dll包含實際的函式和資料,應用程式使用lib檔案鏈結到所需要使用的dll檔案,庫中的函式和資料並不複製到可執行檔案中,因此在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中所要呼叫的函式的記憶體位址,這樣當乙個或多個應用程式執行是再把程式**和被呼叫的函式**鏈結起來,從而節省了記憶體資源。從上面的說明可以看出,dll和.lib檔案必須隨應用程式一起發行,否則應用程式將會產生錯誤。

一般的lib檔案是「導入庫」,用來提供給link.exe,作為鏈結dll——也就是「動態鏈結庫」的依據。裡面記錄了類似下面的資訊:

呼叫函式***(),連線到x.dll的0xabcdefgh位址。

早期的lib,是「靜態鏈結庫」,也是用來提供給link.exe,作為鏈結**用的。裡面的記錄如下:

呼叫***(),其**是……;

dll的lib(導入庫),不含可執行的具體**(**在dll中)。而最早的lib(靜態鏈結庫),裡面含有**。所以,可以看出來,如果乙個函式被呼叫多次,使用dll(動態鏈結技術),可以節省一些硬碟和記憶體空間!而用lib(靜態鏈結技術),每次呼叫,都會鏈結入相同的**,造成一些空間上的浪費。不過它的好處是不需要進行乙個「查詢」工作(也就是找到lib檔案中說的dll的「函式入口點」,就是例子裡的0xabcdefgh位址,可以獲得更高的效率)。

dll的呼叫方式有靜態和動態呼叫兩種方式。

lib 用於靜態呼叫和標頭檔案*.h 結合使用。

如果你只有dll檔案,又知道dll檔案中函式的格式,也可以使用loadlibrary ,getaddress 函式來動態載入呼叫。

delphi 呼叫dll兩種方式

1 外部宣告 在delphi中外部宣告是訪問外部例程最容易和最常用的方式,有兩種宣告方式 通過名字 通過索引號。舉例如下 在mydll.dll中有兩個函式和乙個過程,則其外部宣告可以寫成 function test1 integer external mydll 直接通過名稱呼叫test1 注意名稱...

Dll匯出函式的兩種方式

dll中匯出函式的宣告有兩種方式 一種方式是 在函式宣告中加上 declspec dllexport 另外一種方式是 採用模組定義 def 檔案宣告,def 檔案為鏈結器提供了有關被鏈結程式的匯出 屬性及其他方面的資訊。方式一 在函式宣告中加上 declspec dllexport 在動態鏈結庫程式...

C 註冊dll的兩種方式

普通註冊 system.diagnostics.process p system.diagnostics.process.start regsvr32 path dicomobjects.ocx 管理員註冊 private bool registerdll string dllpath bool r...