動態連結程式庫簡介
自從微軟推出16位的Windows作業系統起,此後每種版本的Windows作業系統都非常依賴於動態連結程式庫(DLL)中的函數和資料,實際上Windows作業系統中幾乎所有的內容都由DLL以一種或另外一種形式代表著,例如顯示的字型和表徵圖儲存在GDI DLL中、顯示Windows案頭和處理使用者的輸入所需要的代碼被儲存在一個User DLL中、Windows編程所需要的大量的API函數也被包含在Kernel DLL中。
DLL是建立在客戶/伺服器通訊的概念上,包含若干函數、類或資源的庫檔案,函數和資料被儲存在一個DLL(伺服器)上並由一個或多個客戶匯出而使用,這些客戶可以是應用程式或者是其它的DLL。
使用動態連結程式庫的優點:
最主要的一點是多個應用程式、甚至是不同語言編寫的應用程式可以共用一個DLL檔案,真正實現了資源"共用",大大縮小了應用程式的執行代碼,更加有效利用了記憶體;
使用DLL的另一個優點是DLL檔案作為一個單獨的程式模組,封裝性、獨立性好,在軟體需要升級的時候開發人員只需要修改相應的DLL檔案就可以了,而且,當DLL中的函數改變後,只要不是參數的改變,程式碼並不需要重新編譯。這在編程時十分有用,大大提高了軟體開發和維護的效率。
靜態庫:
函數和資料被編譯進一個二進位檔案(通常副檔名為LIB),在使用靜態庫的情況下,在編譯連結可執行檔時,連結器從庫中複製這些函數和資料並把他們和應用程式的其他模組組合起來建立最終的可執行檔(EXE檔案)。這個過程稱為"靜態連結",此時因為應用程式所需的全部內容都是從庫中複製了出來,所以靜態庫本身並不需要與可執行檔一起發行。
動態庫:
在使用動態庫的時候,往往提供兩個檔案,一個引入庫和一個DLL,引入庫包含被DLL匯出的函數和變數的符號名,DLL包含實際的函數和資料,在編譯連結可執行檔時,只需要連結引入庫,DLL中的函數代碼和資料並不複製到可執行檔中,在啟動並執行時候再去載入DLL,訪問DLL中匯出的函數
動態連結程式庫載入的2種方式
1.隱式連結:隱式連結就是在程式開始執行時就將DLL檔案載入到應用程式當中。實現隱式連結很容易,只要將匯入函數關鍵字_declspec(dllimport)函數名等寫到應用程式相應的標頭檔中就可以了。
注意:要先將Dll.dll和Dll.lib拷貝到當前工程所在的目錄下面,
2.顯式連結:顯式連結是應用程式在執行過程中隨時可以載入DLL檔案,也可以隨時卸載DLL檔案,這是隱式連結所無法作到的,所以顯式連結具有更好的靈活性,對於解釋性語言更為合適。
首先要將DLL檔案拷貝到工程所在的目錄或Windows系統目錄下。使用顯式連結應用程式編譯時間不需要使用相應的Lib檔案。
主要是三個函數的調用
LoadLibrary//載入動態連結程式庫檔案;
GetProcAddress//擷取匯入到應用程式中的函數指標
FreeLibrary(hDLL)//卸載動態連結程式庫檔案