C 動態鏈結庫

2022-02-01 07:17:39 字數 2235 閱讀 1766

動態鏈結庫英文為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
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 語句。

C 動態鏈結庫

動態鏈結庫是實現共享函式庫概念的一種方式。擴充套件名為 dll 動態鏈結庫提供了一種方法,使程序可以呼叫不屬於其可執行 的函式。函式的可執行 位於乙個dll檔案中,該dll包含乙個或多個已被編譯,鏈結並與他們的程序分開儲存的函式。dll有助於共享資料和資源,多個應用程式可同時訪問記憶體中的單個dll...

C 動態鏈結庫

通過動態鏈結庫實現呼叫者不需要重新編譯的情況下被呼叫者的更改可生效 被呼叫者標頭檔案str.h ifndef str h define str h include include using namespace std class myclass a enum b static string fun...

C 動態鏈結庫

動態鏈結庫是實現共享函式庫概念的一種方式。擴充套件名為 dll 動態鏈結庫提供了一種方法,使程序可以呼叫不屬於其可執行 的函式。函式的可執行 位於乙個dll檔案中,該dll包含乙個或多個已被編譯,鏈結並與他們的程序分開儲存的函式。dll有助於共享資料和資源,多個應用程式可同時訪問記憶體中的單個dll...