DLL是建立在客戶/服務(wù)器通信的概念上,包含若干函數(shù)、類或資源的庫(kù)文件,函數(shù)和數(shù)據(jù)被存儲(chǔ)在一個(gè)DLL(服務(wù)器)上并由一個(gè)或多個(gè)客戶導(dǎo)出而使用,這些客戶可以是應(yīng)用程序或者是其它的DLL。DLL庫(kù)不同于靜態(tài)庫(kù),在靜態(tài)庫(kù)情況下,函數(shù)和數(shù)據(jù)被編譯進(jìn)一個(gè)二進(jìn)制文件(通常擴(kuò)展名為*.LIB),Visual C++的編譯器在處理程序代碼時(shí)將從靜態(tài)庫(kù)中恢復(fù)這些函數(shù)和數(shù)據(jù)并把他們和應(yīng)用程序中的其他模塊組合在一起生成可執(zhí)行文件。這個(gè)過(guò)程稱為"靜態(tài)鏈接",此時(shí)因?yàn)閼?yīng)用程序所需的全部?jī)?nèi)容都是從庫(kù)中復(fù)制了出來(lái),所以靜態(tài)庫(kù)本身并不需要與可執(zhí)行文件一起發(fā)行。
在動(dòng)態(tài)庫(kù)的情況下,有兩個(gè)文件,一個(gè)是引入庫(kù)(.LIB)文件,一個(gè)是DLL文件,引入庫(kù)文件包含被DLL導(dǎo)出的函數(shù)的名稱和位置,DLL包含實(shí)際的函數(shù)和數(shù)據(jù),應(yīng)用程序使用LIB 文件鏈接到所需要使用的DLL文件,庫(kù)中的函數(shù)和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件中,因此在應(yīng)用程序的可執(zhí)行文件中,存放的不是被調(diào)用的函數(shù)代碼,而是DLL中所要調(diào)用的函數(shù)的內(nèi)存地址,這樣當(dāng)一個(gè)或多個(gè)應(yīng)用程序運(yùn)行是再把程序代碼和被調(diào)用的函數(shù)代碼鏈接起來(lái),從而節(jié)省了內(nèi)存資源。從上面的說(shuō)明可以看出,DLL 和.LIB文件必須隨應(yīng)用程序一起發(fā)行,否則應(yīng)用程序?qū)?huì)產(chǎn)生錯(cuò)誤。
微軟的Visual C++支持三種DLL,它們分別是:
Non-MFC Dll(非MFC動(dòng)態(tài)庫(kù))
Regular Dll(常規(guī)DLL)
Extension Dll(擴(kuò)展DLL)。