動態(tài)鏈接庫精品課件_第1頁
動態(tài)鏈接庫精品課件_第2頁
動態(tài)鏈接庫精品課件_第3頁
動態(tài)鏈接庫精品課件_第4頁
動態(tài)鏈接庫精品課件_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、動態(tài)鏈接庫第1頁,共21頁,2022年,5月20日,15點19分,星期一11.1 DLL概述動態(tài)鏈接庫是建立在客戶和服務(wù)器的概念基礎(chǔ)上。函數(shù)和數(shù)據(jù)被封裝在DLL服務(wù)器上,可以由一個或多個客戶導(dǎo)出并且使用。第2頁,共21頁,2022年,5月20日,15點19分,星期一11.1.1 動態(tài)庫和靜態(tài)庫動態(tài)庫是運行時庫,庫函數(shù)和數(shù)據(jù)不復(fù)制到可執(zhí)行文件中,而是創(chuàng)建兩個文件:一個引入庫和一個 DLL。引入庫包含被DLL導(dǎo)出的函數(shù)的名稱和位置,DLL包含實際的函數(shù)和數(shù)據(jù)。使用給定的DLL的導(dǎo)出函數(shù)的應(yīng)用程序鏈接到DLL上。其鏈接方式也包含顯示鏈接和隱式鏈接兩種形式。由于DLL包含DLL的客戶所需要的函數(shù)和數(shù)據(jù)

2、,因此這種DLL必須和可執(zhí)行文件放在一起。靜態(tài)庫的函數(shù)和數(shù)據(jù)被編譯成一個二進制文件。然后,鏈接器從庫中復(fù)制這些函數(shù)和數(shù)據(jù)并把它們和應(yīng)用程序的其他模塊組合起來創(chuàng)建最終的可執(zhí)行文件。當(dāng)應(yīng)用程序鏈接一個靜態(tài)庫時,稱為“靜態(tài)鏈接”。這種形式的應(yīng)用程序所需要的全部內(nèi)容都從庫函數(shù)中復(fù)制到可執(zhí)行文件中??蓤?zhí)行文件的大小往往比較大,庫本身不用一起發(fā)行。 第3頁,共21頁,2022年,5月20日,15點19分,星期一11.1.2 加載DLL加載DLL一般有兩種方法:顯式和隱式。DLL客戶或者通過鏈接庫(DLL)的引入庫,或者通過在客戶的.DEF文件中的IMPORT段列出DLL的導(dǎo)出函數(shù)來隱式加載一個DLL。隱式

3、加載是常用的DLL加載方式。編寫人員只需要簡單的包含所需的頭文件,并鏈接DLL,就可以進行函數(shù)調(diào)用了。第4頁,共21頁,2022年,5月20日,15點19分,星期一11.2 Visual C+ 6.0的常規(guī)DLLVisual C+ 6.0定義了兩種類型的DLL:常規(guī)DLL和擴展DLL。常規(guī)DLL用在導(dǎo)出的函數(shù)是C函數(shù)、C+類或者C+成員函數(shù)的時候。需要注意的是:C+類不是MFC類。如果DLL需要導(dǎo)出的是一個MFC類,就應(yīng)該使用擴展DLL的編寫方式。使用常規(guī)DLL的好處在于:客戶端不一定非要是MFC應(yīng)用程序;常規(guī)的DLL可以在內(nèi)部使用C+類,只導(dǎo)出C函數(shù)的包裝器。對C+類的修改不會影響他的應(yīng)用程

4、序和DLL。第5頁,共21頁,2022年,5月20日,15點19分,星期一11.2.1 常規(guī)DLL的內(nèi)部當(dāng)使用Visual C+的AppWizard創(chuàng)建了一個常規(guī)的DLL時,打開源代碼會發(fā)現(xiàn)一個非常熟悉的類:CWinApp類。CWinApp類的對象也代表著這個DLL。這樣,就可以像開發(fā)Win32應(yīng)用程序一樣開發(fā)和實現(xiàn)DLL。CWinApp類的初始化通常發(fā)生在InitInstance()函數(shù)中,程序員可以取代DLL的CWinApp:InitInstance()函數(shù),并提供全局初始化。第6頁,共21頁,2022年,5月20日,15點19分,星期一11.2.2 動態(tài)加載DLL當(dāng)程序被加載時,Wind

5、ows自動加載應(yīng)用程序隱式鏈接的DLL,但是經(jīng)常需要動態(tài)加載DLL。為了在運行時加載DLL,應(yīng)用程序可以調(diào)用LoadLibrary函數(shù)。這個函數(shù)的原型如下:HINSTANCE LoadLibrary(LPCTSTR lpLibFileName)1為函數(shù)縫編程2多種語言的應(yīng)用程序3頭文件或引入的庫不可使用4從二進制文件中檢索資源第7頁,共21頁,2022年,5月20日,15點19分,星期一11.2.3 使用DLL的全局C+對象Win32 DLL被映射到主調(diào)進程的地址空間時,DLL的激活會獲得數(shù)據(jù)的一個刷新版本。一個DLL需要管理的全局數(shù)據(jù),需要專門進行定義。并且一個DLL的多次激活共享全局數(shù)據(jù)并

6、不困難。當(dāng)定義全局數(shù)據(jù)時,需要使用#pragma指令命名一個數(shù)據(jù)段,在數(shù)據(jù)段內(nèi)生成和初始化想要使用的全局變量。這樣,應(yīng)用程序就可以維護數(shù)據(jù),而不必考慮DLL的激活。當(dāng)需要記錄有多少客戶被附加到一個DLL類的時候,全局數(shù)據(jù)就非常有用了。一般需要計數(shù)器的時候,就要使用這種方法,當(dāng)每一個客戶調(diào)用DLL的時候,就需要使全局的計數(shù)器加1。第8頁,共21頁,2022年,5月20日,15點19分,星期一11.3 MFC擴展DLL常規(guī)DLL典型用于非MFC客戶,而MFC擴展DLL用于導(dǎo)出增強MFC的函數(shù)和類。第9頁,共21頁,2022年,5月20日,15點19分,星期一11.3.1 MFC擴展DLL的內(nèi)部MF

7、C擴展DLL和常規(guī)DLL,都可以用AppWizard創(chuàng)建,可以用類似的方法建立,但是這兩種DLL之間還是有一些根本上的差異的。MFC擴展DLL的任何客戶必須是MFC應(yīng)用程序;MFC擴展DLL不一定需要擁有一個CWinAPP派生類對象;常規(guī)的DLL通過函數(shù)initInstance()和ExitInstance()函數(shù)來實現(xiàn)初始化和退出之前的數(shù)據(jù)處理; MFC的擴展DLL引入了一個新的類CDynLinkLibrary類,以允許CRuntimeClass類或資源的導(dǎo)出。第10頁,共21頁,2022年,5月20日,15點19分,星期一11.3.2 擴展 DLL的導(dǎo)出類MFC擴展DLL通常在產(chǎn)生對導(dǎo)出基

8、于MFC的類的需求時被使用。類及其函數(shù)以兩種方式被導(dǎo)出,具體導(dǎo)出形式取決于:是導(dǎo)出整個類,還是導(dǎo)出類的成員函數(shù)的一個子集。前面,為了從常規(guī)的DLL導(dǎo)出函數(shù),通常使用.DEF文件。MFC擴展導(dǎo)出類簡化了這一工作,當(dāng)需要導(dǎo)出整個類時,可以利用宏AFX_EXT_CLASS用在類聲明中。第11頁,共21頁,2022年,5月20日,15點19分,星期一11.3.3 AFX_EXT_CLASSAFX_EXT_CLASS宏可用于導(dǎo)出整個類或部分類。當(dāng)頭文件中包含有DLL正在導(dǎo)出的類的聲明時,一旦客戶應(yīng)用程序包含了這個頭文件,就可以實現(xiàn)導(dǎo)出該類及其成員。AFX_EXT_CLASS宏可以實現(xiàn)從一個DLL中導(dǎo)出整

9、個類或部分類。如果程序需要使用嵌套的MFC擴展DLL,就會出現(xiàn)其他的問題了。這時候就不需要使用AFX_EXT_CLASS宏了,需要在嵌套的 DLL中重新定義一個宏。第12頁,共21頁,2022年,5月20日,15點19分,星期一11.3.4 導(dǎo)出資源所謂導(dǎo)出資源就是把DLL中的資源導(dǎo)出。如果在一個MFC應(yīng)用程序中的代碼請求MFC加載一個自身的資源,那么MFC首先從當(dāng)前模塊中加載所請求的資源。MFC通過調(diào)用AfxGetResourceHandle()函數(shù)定位該模塊的資源。如果被請求的資源沒有找到,MFC會在應(yīng)用程序的CDynLinkLibrary對象鏈接列表中挨個查找,來定位這個資源。這就需要使

10、用函數(shù)AfxGetResourceHandle()指定模塊的HINSTANCE。第13頁,共21頁,2022年,5月20日,15點19分,星期一11.3.5 DLL中封裝文檔和視圖現(xiàn)在是基于組件的軟件開發(fā)時代,MFC擴展DLL可以把文檔/視圖支持放入動態(tài)鏈接庫中。例:如果要實現(xiàn)一個功能,例如要在一個文檔/視圖結(jié)構(gòu)中支持某類型的圖片顯示。當(dāng)很多應(yīng)用程序都需要這個功能的時候,就可以把這個文檔/視圖結(jié)構(gòu)作為一個功能封裝在相應(yīng)的DLL中。這樣,只要需要顯示這個類型的圖片,只要鏈接這個DLL就可以了。第14頁,共21頁,2022年,5月20日,15點19分,星期一11.4 DLL的創(chuàng)建和訪問本節(jié)講述如何

11、創(chuàng)建DLL,及如何實現(xiàn)對DLL的訪問。分別講述創(chuàng)建MFC DLL和Win32 DLL,以及隱含方式鏈接和顯示方式鏈接。第15頁,共21頁,2022年,5月20日,15點19分,星期一11.4.1 創(chuàng)建MFC DLL創(chuàng)建一個MFC DLL,可以利用Visual C+的AppWizard來實現(xiàn)。第16頁,共21頁,2022年,5月20日,15點19分,星期一11.4.2 創(chuàng)建Win32 DLL下面講解創(chuàng)建Win32 DLL的步驟。第17頁,共21頁,2022年,5月20日,15點19分,星期一11.4.3 隱含方式鏈接要實現(xiàn)對DLL的隱含方式鏈接,應(yīng)用程序需要從DLL的提供者處獲得以下文件;一個包

12、含有關(guān)輸出函數(shù)和/或輸出類聲明的頭文件;DLL的導(dǎo)入庫(.Lib),導(dǎo)入庫是在編譯鏈接DLL的時候創(chuàng)建的;動態(tài)鏈接庫(.DLL文件) 應(yīng)用程序需要在訪問DLL的程序中包含DLL輸出函數(shù)或類聲明的頭文件。另外,應(yīng)用程序?qū)LL函數(shù)或者類的使用就像使用任何其它普通的函數(shù)和類一樣。第18頁,共21頁,2022年,5月20日,15點19分,星期一11.4.4 顯示方式鏈接顯示方式鏈接要求應(yīng)用程序以函數(shù)的形式實時地調(diào)入DLL。要達到顯示鏈接DLL,應(yīng)用程序要做到以下幾點:調(diào)用LoadLibrary函數(shù)以便調(diào)入DLL,并獲得DLL模塊的句柄;調(diào)用GetProcAddress函數(shù)來獲取應(yīng)用程序希望訪問的DLL函數(shù)的入口指針。因為應(yīng)用程序通過指針訪問DLL函數(shù),所以在鏈接應(yīng)用程序時不需要鏈接DLL的控制權(quán);通過DLL函數(shù)指針訪問DLL函數(shù);使用DLL結(jié)束以后,調(diào)用FreeLibrary函數(shù)釋放應(yīng)用程序?qū)LL的控制權(quán)。第19頁,共21頁,2022年,5月20日,15點19分,星期一11.5 動態(tài)鏈接庫的例子為了說明動態(tài)鏈接庫的創(chuàng)建、訪問和使用,在本小節(jié)將給出一個簡單的例子,向讀者展示動態(tài)鏈

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論