使用動態(tài)鏈接庫技術(shù)提高開發(fā)速度_第1頁
使用動態(tài)鏈接庫技術(shù)提高開發(fā)速度_第2頁
使用動態(tài)鏈接庫技術(shù)提高開發(fā)速度_第3頁
使用動態(tài)鏈接庫技術(shù)提高開發(fā)速度_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

使用動態(tài)鏈接庫技術(shù)提高開發(fā)速度

0基于dls的系統(tǒng)服務(wù)平臺自從微軟發(fā)布windows操作系統(tǒng)的第一個版本以來,動態(tài)鏈接庫(dll)一直是windows操作系統(tǒng)的基礎(chǔ)。它不僅是獲取多個過程的主要方式,也是系統(tǒng)服務(wù)向應(yīng)用程序提供系統(tǒng)服務(wù)的重要手段。DLL通常是包含了若干函數(shù)、類和資源的庫文件,它不能直接運(yùn)行,也不能接收消息,但可以被其它執(zhí)行文件和其它DLL文件動態(tài)調(diào)用。使用DLL有許多優(yōu)點(diǎn),首先最主要的是當(dāng)多個應(yīng)用程序通過動態(tài)鏈接的方式共享一個DLL文件時,實(shí)現(xiàn)了資源共享,大大縮小了應(yīng)用程序的執(zhí)行代碼,能更加有效地利用內(nèi)存。其次是DLL作為應(yīng)用程序的獨(dú)立模塊,在修改了DLL后,應(yīng)用程序本身可不作重新編譯,許多應(yīng)用軟件可以通過改寫DLL文件來增強(qiáng)應(yīng)用程序的功能。使用DLL開發(fā)項(xiàng)目,可簡化項(xiàng)目管理,提高開發(fā)速度。1創(chuàng)建dll的方法在VC++開發(fā)環(huán)境中,可以在新建對話框的工程選項(xiàng)卡中選“Win32Dynamic-LinkLibrary”命令建立DLL,這種DLL中不能使用MFC基礎(chǔ)類庫。如果在DLL中需要使用MFC基礎(chǔ)類庫,則可以選擇“MFCAppWizard(dll)”命令創(chuàng)建DLL。這兩種方法創(chuàng)建DLL有許多相似之處,本文以前者的方法為例來創(chuàng)建DLL。創(chuàng)建一個DLL,庫中包含做加法和減法運(yùn)算的兩個函數(shù),并使用一個基于對話框的應(yīng)用程序去調(diào)用這些函數(shù)。應(yīng)用程序在鏈接DLL中的函數(shù)信息之前,需要從DLL文件中導(dǎo)出函數(shù)。導(dǎo)出DLL中的函數(shù)有兩種方法:一是在定義函數(shù)時使用導(dǎo)出函數(shù)關(guān)鍵字“_declspec(dllexport)”;二是使用模塊定義文件(.def)。1.1動態(tài)鏈接庫生成dll文件(1)頭文件(DLL.H)。DLL中函數(shù)的申明一般在頭文件中進(jìn)行,這不僅僅是良好的編程習(xí)慣問題,在項(xiàng)目的其他開發(fā)人員也需要調(diào)用DLL中的函數(shù)時,尤其需要提供頭文件對于給定的例子。其頭文件(DLL.H)可定義如下:其中,extern“C”的作用是為使函數(shù)在導(dǎo)出后,函數(shù)名保持不變。這是因?yàn)镃++編譯器為了支持函數(shù)的重載,在編譯時會改變函數(shù)的名字的緣故。(2)函數(shù)的實(shí)現(xiàn)文件(DLL.CPP)。在函數(shù)的實(shí)現(xiàn)文件中,為了指明DLL中的導(dǎo)出函數(shù)信息,需要事先定義DLL_API,具體如下:定義了DLL_API后,在動態(tài)鏈接庫的實(shí)現(xiàn)文件中,加法和減法運(yùn)算的兩個函數(shù)就被申明為:而其他編程人員的程序不用關(guān)心DLL_API,不用事先定義它,因此,在包含頭文件后,在編譯預(yù)處理后,函數(shù)申明為:其中關(guān)鍵字_declspec(dllimport)指出用戶程序需要的函數(shù)在DLL中需要導(dǎo)入的信息,而關(guān)鍵字_declspec(dllexport)指出DLL中需要導(dǎo)出的信息。對函數(shù)實(shí)現(xiàn)文件進(jìn)行編譯鏈接,會在工程的Debug文件夾下會生成DLL文件(DLL.DLL)和導(dǎo)入庫文件(DLL.LIB)。導(dǎo)入庫文件較小,其中并不包含實(shí)際代碼,只是記錄了相應(yīng)的DLL文件中的信息,以便在鏈接時提供DLL中的相關(guān)函數(shù)等信息。(3)信息查看。生成了DLL文件后,有時需要查看DLL中的導(dǎo)出信息,這可以通過命令Dumpbin來實(shí)現(xiàn)。Dumpbin實(shí)際上是VC++安裝目錄下的一個文件,該安裝目錄通常為:C:\ProgramFiles\MicrosoftVisualStudio\VC98\Bin。有時為了更方便地使用Dumpbin命令,需要事先運(yùn)行相同目錄下的VCVARS32.BAT批處理文件,該批處理文件是用來建立使用VC工具的環(huán)境。在查看前面建立的DLL文件時,需要鍵入如下命令來查看導(dǎo)出信息:該命令列出的主要信息如下:在導(dǎo)出的信息中,可以看到函數(shù)名沒有發(fā)生改變,但在申明函數(shù)中去掉extern“C”后,查看生成的DLL文件,就會發(fā)現(xiàn)導(dǎo)出函數(shù)名發(fā)生了變化。此外,還可以通過圖形工具Depends來查看DLL信息,該工具位于開始菜單中的Visualstudio工具集中。1.2在添加libract函數(shù)時的添加模塊定義文件是文本文件,它包含DLL的聲明信息和DLL文件中導(dǎo)出的函數(shù)。本例中可建立一模塊定義文件DLL1.DEF,文件內(nèi)容如下:其中,LIBRARY語句的作用是指出DLL的名稱,EXPORTS指出要導(dǎo)出的函數(shù)名稱。查閱MSDN可以知道,導(dǎo)出函數(shù)時還可以在函數(shù)后加@n表示要導(dǎo)出的函數(shù)順序號,如Add@1、Subtract@2等。在DLL的實(shí)現(xiàn)文件(DLL1.CPP)中寫上Add和Subtract函數(shù)的定義,在編譯鏈接后生成DLL1.DLL。通過命令dumpbin查看動態(tài)鏈接庫的信息時,也可以看到函數(shù)的導(dǎo)出名稱沒有改變。2動態(tài)鏈接庫dll的調(diào)用調(diào)用DLL分為隱式鏈接和顯式鏈接,使用方式和條件都不相同。2.1面卡的生成文件隱式鏈接通常需要三個文件,即DLL文件(DLL.DLL)、導(dǎo)入庫文件(DLL.LIB)和頭文件(DLL.H),而且要把這三個文件復(fù)制到應(yīng)用程序工程目錄下。其實(shí)Windows操作系統(tǒng)的加載程序查找應(yīng)用程序所需的全部DLL,并將它們映射到進(jìn)程的地址空間中時,其搜索的先后順序如下:包含可執(zhí)行映像文件的目錄;當(dāng)前目錄;Windows系統(tǒng)目錄;Windows目錄;PATH環(huán)境變量中列出的各個目錄。除了要把相關(guān)的文件復(fù)制到指定的目錄下以外,還要在工程的設(shè)置對話框中的Link選項(xiàng)卡上,在LibraryModules框中要寫入導(dǎo)入庫文件的名稱。隱式鏈接有其缺點(diǎn),即當(dāng)DLL中包含較多的函數(shù)時,裝載應(yīng)用程序時會將全部的DLL中的函數(shù)裝入內(nèi)存,而不管是否用到該函數(shù)。例如,創(chuàng)建一個基于對話框的MFCAppWizard(.exe)應(yīng)用程序TestDLL.exe的過程。(1)用MFCAppWizard(.exe)生成一個基于對話框的應(yīng)用程序TestDLL;(2)把前面生成的三個文件:DLL.H、DLL.DLL、DLL.LIB復(fù)制到工程目錄下;(3)工程設(shè)置對話中的Link選項(xiàng)卡上寫入DLL.LIB;(4)在TestDLLDlg.CPP的首部添加代碼:#include“DLL.H”;(5)在對話框資源上添加兩個命令按鈕,其控件ID分別為:IDC_BTN_ADD和IDC_BTN_SUBTRACT,Caption分別為Add和Subtract,代碼如下:最后,應(yīng)用程序的運(yùn)行結(jié)果如圖1所示。2.2可加載其他文件顯式鏈接是指應(yīng)用程序執(zhí)行過程中調(diào)用某函數(shù)時,才把該函數(shù)從DLL中裝入內(nèi)存,也可以隨時卸載DLL文件。這是一種比較節(jié)約內(nèi)存的調(diào)用方式,與隱式鏈接相比,它不需要頭文件和導(dǎo)入庫文件,具有更好的靈活性。在顯式鏈接中常常要用到以下幾個函數(shù):LoadLibrary()和FreeLibrary()函數(shù)用來加載和卸載一個DLL文件映像;GetModuleHandle()函數(shù)可以檢查DLL是否已經(jīng)被映射到進(jìn)程的地址空間中;GetProcAddress()函數(shù)用來得到已加載的DLL中某個函數(shù)的地址。為了顯式鏈接已經(jīng)創(chuàng)建的DLL1.DLL,可以再次創(chuàng)建一個基于對話框的MFCAppWizard(.exe)應(yīng)用程序TestDL

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論