dll是什麼檔案格式?
DLL檔案(Dynamic Linkable Library 即動態連結庫檔案),是一種不能單獨執行的文件,它允許程式共享執行特殊任務所必需的程式碼和其他資源
#比較大的應用程式都由許多模組組成,這些模組分別完成相對獨立的功能,它們彼此協作來完成整個軟體系統的工作。可能存在一些模組的功能較為通用,在構造其它軟體系統時仍會被使用。在建構軟體系統時,如果將所有模組的原始程式碼靜態編譯到整個應用程式EXE 檔案中,會產生一些問題:一個缺點是增加了應用程式的大小,它會佔用更多的磁碟空間,程式運行時也會消耗較大的記憶體空間,造成系統資源的浪費;另一個缺點是,在編寫大的EXE 程式時,在每次修改重建時都必須調整編譯所有原始碼,增加了編譯過程的複雜性,也不利於階段性的單元測試。
Windows 系統平台上提供了一個完全不同的較有效的程式設計和運行環境,你可以將獨立的程式模組建立為較小的 DLL 文件,並可對它們單獨編譯和測試。在運作時,只有當 EXE 程式確實要呼叫這些 DLL 模組的情況下,系統才會將它們裝載到記憶體空間中。這種方式不僅減少了 EXE 檔案的大小和對記憶體空間的需求,而且使這些 DLL 模組可以同時被多個應用程式使用。 Windows 本身就將一些主要的系統功能以 DLL 模組的形式實現。
一般來說,DLL 是一種磁碟文件,以.dll、.DRV、.FON、.SYS 和許多以 .EXE 為副檔名的系統檔案都可以是 DLL。它由全域資料、服務函數和資源組成,在運行時被系統載入到呼叫程序的虛擬空間中,成為呼叫程序的一部分。如果與其它 DLL 之間沒有衝突,則該檔案通常會對應到進程虛擬空間的相同位址上。 DLL 模組包含各種導出函數,用於向外界提供服務。 DLL 可以有自己的資料段,但沒有自己的堆疊,使用與呼叫它的應用程式相同的堆疊模式;一個DLL 在記憶體中只有一個實例;DLL 實作了程式碼封裝性;DLL 的編制與特定的程式語言及編譯器無關。
在 Win32 環境中,每個進程都複製了自己的讀取/寫入全域變數。如果想要與其它進程共享內存,則必須使用內存映射檔案或聲明一個共享資料段。 DLL 模組所需的堆疊記憶體都是從運行進程的堆疊中分配出來的。 Windows 在載入 DLL 模組時將進程函數呼叫與 DLL 檔案的匯出函數相符。 Windows 作業系統對 DLL 的操作只是把 DLL 對應到需要它的程序的虛擬位址空間。 DLL 函數中的程式碼所建立的任何物件(包括變數)都歸呼叫它的執行緒或進程所有。
呼叫方式:
1、靜態呼叫方式:由編譯系統完成對DLL 的載入和應用程式結束時DLL 卸載的編碼(如還有其它程序使用該DLL,則Windows 對DLL 的應用記錄減1,直到所有相關程式都結束對該DLL 的使用時才釋放它,簡單實用,但不夠靈活,只能滿足一般要求。
隱式的呼叫:需要把產生動態連線函式庫時產生的.LIB 檔案加入到應用程式的工程中,想使用DLL 中的函式時,只須說明一下。隱式呼叫不需要呼叫LoadLibrary() 和FreeLibrary() .程式設計師在建立一個DLL 檔案時,連結程式會自動產生一個與之對應的LIB 匯入檔案。該檔案包含了每一個DLL 匯出函數的符號名稱和可選的識別號,但是並不含有實際的程式碼。 LIB 檔案作為DLL 的替代檔案被編譯到應用程式專案中。
當程式設計師透過靜態連結方式編譯生成應用程式時,應用程式中的呼叫函數與LIB 檔案中匯出符號相匹配,這些符號或識別號碼進入到產生的EXE 檔案。LIB 檔案中也包含了對應的DL L檔案名稱(但不是完全的路徑名稱),連結程式將其儲存在EXE 檔案內部。
當應用程式運行過程中需要載入DLL 檔案時,Windows 根據這些資訊發現並載入DLL,然後透過符號名稱或識別號碼實現對DLL 函數的動態連結。所有被應用程式呼叫的DLL 檔案都會在應用程式EXE 檔案載入時被載入在記憶體中。可執行程式連結到一個包含DLL 輸出函數資訊的輸入庫檔案(.LIB檔案)。作業系統在載入使用執行程式時載入DLL。可執行程式直接透過函數名稱呼叫DLL的輸出函數,呼叫方法和程式內部其它的函數是一樣的。
2、動態呼叫方式:是由程式設計者用API 函數載入和卸載DLL 來達到呼叫DLL 的目的,使用上較複雜,但能更有效地使用內存,是編制大型應用程式時的重要方式。
明確的呼叫:
是指在應用程式中用LoadLibrary 或MFC 提供的AfxLoadLibrary 明確的將自己所做的動態連接庫調進來,動態連接庫的檔名就是上面兩個函數的參數,再用GetProcAddress() 取得想要引進的函數。自此,你就可以像使用如同本應用程式自訂的函數一樣來呼叫此引入函數了。在應用程式退出之前,應該用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 釋放動態連線程式庫。直接呼叫 Win32 的 LoadLibary 函數,並指定 DLL 的路徑作為參數。 LoadLibary 傳回 HINSTANCE 參數,應用程式在呼叫 GetProcAddress 函數時使用此參數。 GetProcAddress 函數將符號名稱或識別號碼轉換為 DLL 內部的位址。程式設計師可以決定 DLL 檔案何時加載或不加載,明確連結在運行時決定加載哪個 DLL 檔案。使用 DLL 的程式在使用前必須載入(LoadLibrary)載入DLL以獲得一個DLL模組的句柄,然後呼叫 GetProcAddress 函式得到輸出函式的指針,在退出前必須卸載DLL(FreeLibrary)。
正因為DLL 有佔用記憶體小,好編輯等的特色有很多電腦病毒都是DLL格式檔。但不能單獨運行。
動態連結庫通常都不能直接執行,也不能接收訊息。它們是一些獨立的文件,其中包含能被可執行程式或其它DLL呼叫來完成某項工作的函數。只有在其它模組調用動態連結庫中的函數時,它才發揮作用。
以上是dll是什麼文件格式的詳細內容。更多資訊請關注PHP中文網其他相關文章!