1. 動態(tài)鏈接庫的概念及優(yōu)點(diǎn)動態(tài)鏈接庫是一個函數(shù)和變量的集合,在調(diào)用它的程序運(yùn)行時才被加載。因此,動態(tài)鏈接庫和可執(zhí)行程序是分離的。 動態(tài)鏈接庫具有以下優(yōu)點(diǎn): (1) 隱藏源代碼; (2)實(shí)現(xiàn)代碼重用; (3)當(dāng)程序調(diào)用DLL中的函數(shù)時不需要重新編譯,提高編譯速度; (4)當(dāng)多個程序調(diào)用同一DLL中函數(shù)時,內(nèi)存中只有一個副本,節(jié)省內(nèi)存空間; (5)可通過替換DLL來實(shí)現(xiàn)程序的維護(hù)和升級。 2.動態(tài)鏈接庫加載的方法當(dāng)在應(yīng)用程序中加載DLL時,有兩種方法來調(diào)用導(dǎo)出的DLL函數(shù):加載時動態(tài)鏈接和運(yùn)行時動態(tài)鏈接。 在加載時動態(tài)鏈接中,應(yīng)用程序像調(diào)用本地函數(shù)一樣對導(dǎo)出的DLL函數(shù)進(jìn)行顯式調(diào)用。要使用加載時動態(tài)鏈接,請在編譯和鏈接應(yīng)用程序時提供頭文件(.h)和導(dǎo)入庫文件(.lib)。當(dāng)您這樣做時,鏈接器將向系統(tǒng)提供加載DLL所需的信息,并在加載時解析導(dǎo)出的DLL函數(shù)的位置。 在運(yùn)行時動態(tài)鏈接中,應(yīng)用程序調(diào)用LoadLibrary函數(shù)或LoadLibraryEx函數(shù)以在運(yùn)行時加載DLL。成功加載DLL后,可以使用GetProcAddress函數(shù)獲得要調(diào)用的導(dǎo)出的DLL函數(shù)的地址。在使用運(yùn)行時動態(tài)鏈接時,無需使用導(dǎo)入庫文件。 可以根據(jù)下面的 準(zhǔn)則來判斷使用哪一種鏈接方式。 (1)啟動性能 如果應(yīng)用程序的初始啟動性能很重要,則應(yīng)使用運(yùn)行時動態(tài)鏈接。 (2)易用性 在加載時動態(tài)鏈接中,導(dǎo)出的 DLL 函數(shù)類似于本地函數(shù)。這使您可以方便地調(diào)用這些函數(shù)。 (3)應(yīng)用程序邏輯 在運(yùn)行時動態(tài)鏈接中,應(yīng)用程序可以分支,以便按照需要加載不同的模塊。在開發(fā)多語言版本時,這一點(diǎn)很重要。 3.創(chuàng)建動態(tài)鏈接庫 3.1 建立一個工程項(xiàng)目 打開Visual Studio 2008,F(xiàn)ile -> New -> Project…,選擇Win32 Console Application,Name設(shè)置為myDLLTest。 next-> Application type->Dll,additional options->Empty project,單擊Finish按鈕。 3.2 添加myDllTest.h文件
3.3 添加myDllTest.cpp文件
3.4 編譯
myDllTest.dll,myDllTestd.lib,myDllTest.lib和myLibTest.h是我們最終交付給用戶的文件。 加載時動態(tài)鏈接方式調(diào)用動態(tài)鏈接庫 4.1 環(huán)境變量設(shè)置
如果工程比較大,則可以在本地硬盤的其它位置新建一個文件夾,命名為myDTest,再新建三個子文件夾bin,include和lib,將DLL文件放到bin中,H文件放到include中,LIB文件放到lib中。計算機(jī)->屬性->高級系統(tǒng)設(shè)置->環(huán)境變量。在系統(tǒng)變量->新建->環(huán)境變量名myLibTest,變量值為myDTest文件夾所在目錄;用戶變量->編輯Path環(huán)境變量,添加myDTest中bin的路徑;(不同的語句用;間隔)。
4.2 VS環(huán)境設(shè)置
工程比較小時,可將DLL,H和LIB文件直接復(fù)制到當(dāng)前工程下,不需要添加環(huán)境變量。這時在包含對應(yīng)頭文件時應(yīng)當(dāng)使用雙引號而不是尖括號。
4.3 新建調(diào)用動態(tài)庫的工程
4.4 環(huán)境設(shè)置
在Project -> Properties->configuration properties,C++ ->addtional include direction中添加include文件路徑;link
-> general ->Additional library Direction中添加lib的路徑,在link->input->additional dependence。Debug模式下添加Debug模式下編譯的LIB文件,Release模式下添加Release模式下編譯的LIB文件。
4.5 運(yùn)行
按下快捷鍵Ctrl+5,編譯程序
|
|