




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第第10章章 動態(tài)鏈接庫(動態(tài)鏈接庫(DLL) 應(yīng)用編程應(yīng)用編程 本章要點: 動態(tài)鏈接庫(DLL)的概念 動態(tài)鏈接庫的編寫 動態(tài)鏈接庫的隱式調(diào)用和顯示調(diào)用 利用動態(tài)鏈接庫實現(xiàn)窗體重用的方法10.1 循序漸進(jìn)學(xué)理論 10.1.1 動態(tài)鏈接庫(動態(tài)鏈接庫(DLL)概述)概述 1DLL的概念 DLL是一個可以執(zhí)行的并可以被多個Windows應(yīng)用程序共享的程序模塊(稱為Module),模塊中包含了一些可以被多個Windows應(yīng)用程序或DLL共享的代碼、數(shù)據(jù)和資源。 動態(tài)連接庫文件的擴(kuò)展名一般是dll,也有可能是drv,sys和fon(它們分別對應(yīng)的是設(shè)備驅(qū)動文件、系統(tǒng)文件和字體資源文件)。 2靜態(tài)鏈接
2、和動態(tài)鏈接 (1)靜態(tài)鏈接 傳統(tǒng)的庫函數(shù)是通過靜態(tài)鏈接鏈到應(yīng)用程序中的。這些庫函數(shù)可能來自編程語言提供的標(biāo)準(zhǔn)庫,也可能是由操作系統(tǒng)提供的API。 (2)動態(tài)鏈接 動態(tài)鏈接是指在把應(yīng)用程序的目標(biāo)代碼鏈接成EXE文件時并沒有將函數(shù)庫中的函數(shù)復(fù)制到應(yīng)用程序的可執(zhí)行文件中,而是在程序運行時動態(tài)地加載所需的函數(shù)。 3使用DLL的優(yōu)點 使用動態(tài)鏈接庫還有以下優(yōu)點: (1)應(yīng)用范圍廣。 (2)便于開發(fā)大型軟件。 (3)便于對系統(tǒng)進(jìn)行升級。 (4)隱藏細(xì)節(jié)。(5)獨立于編程語言。 10.1.2 動態(tài)鏈接庫(動態(tài)鏈接庫(DLL)編寫)編寫 根據(jù)動態(tài)鏈接庫完成的功能,可把DLL分成三類:完成一般功能的DLL、用于
3、數(shù)據(jù)交換的DLL和用于窗體重用的DLL。 【例10-1】創(chuàng)建一個動態(tài)鏈接庫,該動態(tài)鏈接庫中包含兩個函數(shù),分別用于求三個數(shù)的最大值和最小值。為編寫該動態(tài)鏈接庫,需經(jīng)過以下步驟: (1)建立DLL程序框架 在Delphi 7.0集成環(huán)境中,執(zhí)行【File】【New】【Other】命令,將會出現(xiàn)【New Items】對話框窗口,在該窗口中找到【DLL Wizard】圖標(biāo),如圖10-3所示。 圖10-3 “New Items”對話框 2建立過程和函數(shù) 為該動態(tài)鏈接庫項目增加如下兩個函數(shù):為該動態(tài)鏈接庫項目增加如下兩個函數(shù): Function Max(x,y,z:Integer):Integer;std
4、call;/求三個數(shù)的最大值函數(shù) Function Min(x,y,z:Integer):Integer;stdcall;/求三個數(shù)的最小值函數(shù) (3)用exports語句聲明供其它應(yīng)用程序 調(diào)用的函數(shù)和過程名 函數(shù)或過程定義好后,為了能夠被其它應(yīng)用程序調(diào)用,還必須用Exports子句把函數(shù)名列出。本例使用的Exports語句如下:exports Max,Min;Exports語句的格式與功能如下:exportsentry1,entry2,entryn; (4)生成DLL文件執(zhí)行【Project】【Build Exam_10_1】命令(“Exam_10_1”為動態(tài)鏈接庫項目文件名),將自動生成
5、名為“Exam_10_1.dll”的動態(tài)鏈接庫文件。 10.1.3 加載動態(tài)鏈接庫(加載動態(tài)鏈接庫(DLL)的方法)的方法 1靜態(tài)載入DLL 這種方法是將DLL文件映像映射到調(diào)用進(jìn)程地址空間的最簡單的辦法。 靜態(tài)載入DLL的前提是在編譯之前已經(jīng)明確知道要調(diào)用DLL中的哪幾個函數(shù),編譯時在目標(biāo)文件中只保留必要的鏈接信息,而不包含DLL函數(shù)的代碼。在程序執(zhí)行時,利用鏈接信息加載DLL函數(shù)代碼并在內(nèi)存中將其鏈接進(jìn)入調(diào)用程序的執(zhí)行空間,從而實現(xiàn)了代碼的重用。 2動態(tài)載入DLL 動態(tài)載入方式是指在編譯之前并不知道將會調(diào)用哪些DLL函數(shù),完全是在運行過程中根據(jù)需要決定應(yīng)調(diào)用哪些函數(shù),并用LoadLibra
6、ry函數(shù)加載動態(tài)鏈接庫到內(nèi)存,用GetProcAddress函數(shù)動態(tài)獲得DLL函數(shù)的入口地址。 動態(tài)調(diào)用使用的Windows API函數(shù)主要有3個,分別是LoadLibrary、GetProcAddress和FreeLibrary。 (1)LoadLibrary函數(shù) 格式:functionLoadLibrary(LibFileName:PChar):Thandle;功能:加載由參數(shù)LibFileName指定的DLL文件。 (2)GetProcAddress函數(shù)格式:functionGetProcAddress(Module:Thandle;ProcName:PChar):TfarProc; 功
7、能:返回參數(shù)Module指定的模塊中,由參數(shù)ProcName指定的過程或函數(shù)的入口地址。(3)FreeLibrary函數(shù) 格式:procedure FreeLibrary(Module:Thandle);功能:將由參數(shù)Module指定的DLL文件從內(nèi)存中卸載1次。 10.1.4 調(diào)用動態(tài)鏈接庫(調(diào)用動態(tài)鏈接庫(DLL)中的過程和函數(shù)中的過程和函數(shù) 在應(yīng)用程序中,調(diào)用動態(tài)鏈接庫也有兩種方法。分別是隱式調(diào)用和顯示調(diào)用。 1隱式調(diào)用 隱式調(diào)用又稱靜態(tài)調(diào)用或裝載時調(diào)用,對應(yīng)于DLL的靜態(tài)載入。要在應(yīng)用程序中隱式調(diào)用某個動態(tài)鏈接庫中的函數(shù),一般要做以下兩件事情:(1)用extern子句聲明要調(diào)用的過程或
8、函數(shù)及其所在的DLL文件名;(2)在應(yīng)用程序中直接調(diào)用用extern子句聲明的過程。 【例10-2】 編寫一個應(yīng)用程序用來調(diào)用例10-1所建立的動態(tài)鏈接庫中的Max和Min函數(shù),要求使用隱式調(diào)用。程序的設(shè)計界面如圖10-4所示,函數(shù)的運行界面如圖10-5所示。程序運行時輸入三個數(shù)到三個編輯框中,然后按【求最大值】按鈕,將會求出三個數(shù)的最大值并顯示在第四個文本框中,如果按【求最小值】按鈕,將會求出三個數(shù)的最小值并顯示在第四個文本框中。 圖10-4 例10-2程序設(shè)計界面 圖10-5 例10-2程序運行界面 2顯式調(diào)用 靜態(tài)調(diào)用DLL中的函數(shù),程序?qū)崿F(xiàn)比較簡單,代碼較少,但也有一些不足,主要表現(xiàn)在
9、:(1)如果加載的DLL文件不存在或者DLL中沒有要引入的例程,程序?qū)⒆詣咏K止運行;(2)DLL文件一旦加載就一直駐留在應(yīng)用程序的地址空間,即使后面已不再使用它了。 顯式調(diào)用動態(tài)鏈接庫中的函數(shù)一般需經(jīng)歷以下步驟:(1)定義一個與調(diào)用函數(shù)一致的函數(shù)類型;(2)用LoadLibrary或SafeLoadLibrary函數(shù)動態(tài)載入動態(tài)鏈接庫;(3)用GetProcAddress得到要調(diào)用的函數(shù)或過程的地址;(4)利用定義的函數(shù)類型生成一個同類型的函數(shù)變量(本題為Myfunct);(5)進(jìn)行函數(shù)調(diào)用(本題調(diào)用語句為:Myfunct(x,y,z););(6)利用FreeLibrary函數(shù)卸載動態(tài)鏈接庫。
10、 【例10-3】 編寫一個應(yīng)用程序用來調(diào)用例10-1所建立的動態(tài)鏈接庫中的Max和Min函數(shù),要求使用顯示調(diào)用。程序的設(shè)計界面和運行界面及程序功能同例10-2。10.1.5 在動態(tài)鏈接庫(在動態(tài)鏈接庫(DLL)中實現(xiàn)窗體重用中實現(xiàn)窗體重用 利用DLL實現(xiàn)窗體重用一般需經(jīng)歷以下幾步:(1)在Delphi的集成開發(fā)環(huán)境中,設(shè)計出需要重用的窗體;(2)編寫一個用于輸出的函數(shù)或過程,在該函數(shù)或過程中,對設(shè)計的窗體進(jìn)行創(chuàng)建使它實例化;(3)如果要把多個窗體編譯在一個DLL文件中,可重復(fù)(1)和(2),直到所有需要的窗體建立完畢,所有對窗體進(jìn)行實例化的函數(shù)或過程創(chuàng)建完畢;(4)為適應(yīng)生成.DLL文件的需要
11、,對工程文件進(jìn)行相應(yīng)修改;(5)編譯工程文件以生成DLL文件;(6)在需要該窗體的其它應(yīng)用程序中重用該窗體。 【例10-4】 在許多應(yīng)用程序中都有在兩個列表框中移動選項的窗體,請設(shè)計一個這樣的可重用窗體,設(shè)計界面如圖10-6所示。該窗體運行時,在左邊的列表框中選中若干個選項后按【】按鈕,將把選中的選項移動到右邊的列表框中;在右邊的列表框中選中若干個選項后按【】按鈕將把左邊的列表框中的所有選項移動到右邊的列表框中;按【】按鈕將把右邊的列表框中的所有選項移動到左邊的列表框中。然后再編寫一個應(yīng)用程序用來調(diào)用該窗體。 圖10-6 設(shè)計界面 為完成本題的功能,應(yīng)經(jīng)歷以下步驟。 (1)設(shè)計窗體。 新建一個
12、應(yīng)用程序,按圖10-6所示給Form1添加組件對象。(2)編寫輸出函數(shù)或過程,實例化窗體。(3)修改工程文件,使之能生成DLL文件 窗體單元編制完成之后,可把應(yīng)用程序項目轉(zhuǎn)換為DLL。首先執(zhí)行【Proiect】【View】 Source】命令來打開.dpr項目文件,并在代碼編輯器中做如下修改: 把program改為Library; 從Uses指令中刪除Forms; 在$R資源指令和工程的uses指令的最后一行之間,插入關(guān)鍵字export,后跟單元的訪問過程或函數(shù)名稱(在本例中,就是ListMoveF),如果有多個窗體要重用,可列出多個函數(shù)或過程名; 刪除begin和end之間的所有語句,讓初始
13、化代碼塊留空。 (4)生成DLL文件 執(zhí)行【Project】【Build EXAMDLL】命令,生成EXAMDLL.DLL動態(tài)鏈接庫文件。 (5)編寫一個應(yīng)用程序調(diào)用該窗體 圖10-7 調(diào)用程序設(shè)計界面 圖10-8 彈出的可重用窗體 圖10-9 程序的運行結(jié)果界面 10.2 典型實例練能力 10.2.1 典型實例一:顯式調(diào)用動態(tài)鏈接庫中的典型實例一:顯式調(diào)用動態(tài)鏈接庫中的 多種形式的函數(shù)多種形式的函數(shù) 【實例題目】 編寫一個動態(tài)鏈接庫文件,取名為FUNDLL4,該庫中有三個函數(shù)AlphNum、DigNum和HuiWen,它們的功能分別是求出字符中字母字符的個數(shù)、數(shù)字字符的個數(shù)和字符串是否為回文
14、。然后編寫一個項目文件,在該項目文件中對這三個函數(shù)進(jìn)行調(diào)用。要求:在項目文件中采用顯式調(diào)用的方法調(diào)用動態(tài)鏈接庫中的函數(shù)。程序的設(shè)計界面與運行界面分別如圖10-10和圖10-11所示。程序執(zhí)行時在Edit1編輯框中輸入字符串,接著在ComboBox1復(fù)選框中選擇操作種類,然后單擊【執(zhí)行操作】按鈕將調(diào)用相應(yīng)的函數(shù),得到執(zhí)行結(jié)果。 圖10-10 程序設(shè)計界面 圖10-11 程序運行界面 10.3 上機(jī)練習(xí)重應(yīng)用 10.3.1 上機(jī)練習(xí)一:一維數(shù)組求值相關(guān)算法動上機(jī)練習(xí)一:一維數(shù)組求值相關(guān)算法動 態(tài)鏈接庫的編制態(tài)鏈接庫的編制 【練習(xí)【練習(xí)題目題目】 編寫一個動態(tài)鏈接庫MyDLL.DLL,為該動態(tài)鏈接庫創(chuàng)建四個函數(shù)Max、Min、Sum和Aver,分別用來求具有N(參數(shù))個元素的一維數(shù)組的最大值、最小值、總和及平均值。然后再創(chuàng)建一個應(yīng)用程序,通過對這些函
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄰居土地租賃協(xié)議書范本
- 廠房安全風(fēng)險評估與預(yù)防合同
- 香港法律婚前協(xié)議書范本
- 采石場經(jīng)營權(quán)與資源權(quán)轉(zhuǎn)讓協(xié)議
- 柴油運輸碳排放交易合同
- 餐飲行業(yè)食品安全管理合作協(xié)議書
- 餐飲品牌直營店租賃合作協(xié)議
- 車輛產(chǎn)權(quán)轉(zhuǎn)讓與質(zhì)保服務(wù)合同范本
- 系桿拱橋吊桿張拉順序?qū)n}
- 離子沉積技術(shù)培訓(xùn)課件
- 2025年中國膨潤土貓砂項目投資可行性研究報告
- 職業(yè)技術(shù)學(xué)院2024級智能機(jī)器人技術(shù)專業(yè)人才培養(yǎng)方案
- TSG G7002-2015 鍋爐定期檢驗規(guī)則
- 給酒店提供早餐合同協(xié)議
- 2025華陽新材料科技集團(tuán)有限公司招聘(500人)筆試參考題庫附帶答案詳解
- GA 1812.2-2024銀行系統(tǒng)反恐怖防范要求第2部分:數(shù)據(jù)中心
- 《肉芽腫性血管炎》課件
- 2025年入黨積極分子培訓(xùn)考試題庫及答案(二)
- 初中體育《足球腳內(nèi)側(cè)運球》課件大綱
- 青海省西寧市2025屆九年級下學(xué)期中考一模地理試卷(含答案)
- 2023+ESC急性冠狀動脈綜合征管理指南解讀 課件
評論
0/150
提交評論