動態連結程式庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL 是一個包含可由多個程式同時使用的代碼和資料的庫,DLL不是可執行檔。動態連結提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、連結並與使用它們的進程分開儲存的函數。DLL 還有助於共用資料和資源。多個應用程式可同時訪問記憶體中單個DLL 副本的內容。DLL 是一個包含可由多個程式同時使用的代碼和資料的庫。
通過使用 DLL,程式可以實現模組化,由相對獨立的組件組成。例如,一個計帳程式可以按模組來銷售。可以在運行時將各個模組載入到主程式中(如果安裝了相應模組)。因為模組是彼此獨立的,所以程式的載入速度更快,而且模組只在相應的功能被請求時才載入。 此外,可以更為容易地將更新應用於各個模組,而不會影響該程式的其他部分。例如,您可能具有一個工資計算程式,而稅率每年都會更改。當這些更改被隔離到 DLL 中以後,您無需重建或安裝整個程式就可以應用程式更新。 下表說明了 Windows 作業系統中的一些作為 DLL 實現的檔案: • ActiveX 控制項 (.ocx) 檔案 ActiveX 控制項的一個樣本是日曆控制項,它使您可以從日曆中選擇日期。 • 控制台 (.cpl) 檔案 .cpl 檔案的一個樣本是位於控制台中的項。每個項都是一個專用 DLL。 • 裝置驅動程式 (.drv) 檔案 裝置驅動程式的一個樣本是控制列印到印表機的印表機驅動程式。
1、擴充了應用程式的特性; 2、可以用許多種程式設計語言來編寫; 3、簡化了軟體項目的管理; 4、有助於節省記憶體; 5、有助於資源共用; 6、有助於應用程式的本地化; 7、有助於解決平台差異; 8、可以用於一些特殊的目的。windows使得某些特性只能為DLL所用。
當某個程式或 DLL 使用其他 DLL 中的 DLL 函數時,就會建立依賴項。因此,該程式就不再是獨立的,並且如果該依賴項被損壞,該程式就可能遇到問題。例如,如果發生下列操作之一,則該程式可能無法運行: • 依賴 DLL 升級到新版本。 • 修複了依賴 DLL。 • 依賴 DLL 被其早期版本覆蓋。 • 從電腦中刪除了依賴 DLL。 這些操作通常稱為 DLL 衝突。如果沒有強制實現向後相容性,則該程式可能無法成功運行。
在建立 DLL 時,可以有選擇地指定進入點函數。當進程或線程將它們自身附加到 DLL 或者將它們自身從 DLL 分離時,將調用進入點函數。您可以使用進入點函數根據 DLL 的需要來初始化資料結構或者銷毀資料結構。此外,如果應用程式是多線程的,則可以在進入點函數中使用執行緒區域儲存 (TLS) 來分配各個線程專用的記憶體。下面的代碼是一個 DLL 進入點函數的樣本:
BOOL APIENTRY DllMain( HANDLE hModule, // Handle to DLL module DWORD ul_reason_for_call, // Reason for calling function LPVOID lpReserved )
// Reserved { switch ( ul_reason_for_call ) { case DLL_PROCESS_ATTACHED:
// A process is loading the DLL. break; case DLL_THREAD_ATTACHED: // A process is creating a new thread. break;
case DLL_THREAD_DETACH: // A thread exits normally. break; case DLL_PROCESS_DETACH: // A process unloads the DLL. break; }
return TRUE; }
當進入點函數返回 FALSE 值時,如果您使用的是載入時動態連結,則應用程式不啟動。如果您使用的是運行時動態連結,則只有個別 DLL 不會載入。 進入點函數只應執行簡單的初始化任務,不應調用任何其他 DLL 載入函數或終止函數。例如,在進入點函數中,不應直接或間接調用 LoadLibrary 函數或 LoadLibraryEx 函數。此外,不應在進程終止時調用 FreeLibrary 函數。 注意:在多線程應用程式中,請確保將對 DLL 全域資料的訪問進行同步(安全執行緒),以避免可能的資料損毀。為此,請使用 TLS 為各個線程提供唯一的資料。
要匯出 DLL 函數,您可以嚮導出的 DLL 函數中添加函數關鍵字,也可以建立模組定義檔案 (.def) 以列出匯出的 DLL 函數。
兩種方法
方法一、嚮導出的 DLL 函數中添加函數關鍵字
要使用函數關鍵字,您必須使用以下關鍵字來聲明要匯出的各個函數:
__declspec(dllexport)
要在應用程式中使用匯出的 DLL 函數,您必須使用以下關鍵字來聲明要匯入的各個函數:
__declspec(dllimport)
通常情況下,您最好使用一個包含 define 語句和 ifdef 語句的標頭檔,以便分隔匯出語句和匯入語句。
方法二、建立模組定義檔案 (.def) 以列出匯出的 DLL 函數
使用模組定義檔案來聲明匯出的 DLL 函數。當您使用模組定義檔案時,您不必嚮導出的 DLL 函數中添加函數關鍵字。在模組定義檔案中,您可以聲明 DLL 的 LIBRARY 語句和 EXPORTS 語句。