




版權(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)用編程 本章要點(diǎn): 動態(tài)鏈接庫(DLL)的概念 動態(tài)鏈接庫的編寫 動態(tài)鏈接庫的隱式調(diào)用和顯示調(diào)用 利用動態(tài)鏈接庫實(shí)現(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í)行文件中,而是在程序運(yùn)行時動態(tài)地加載所需的函數(shù)。 3使用DLL的優(yōu)點(diǎn) 使用動態(tài)鏈接庫還有以下優(yōu)點(diǎn): (1)應(yīng)用范圍廣。 (2)便于開發(fā)大型軟件。 (3)便于對系統(tǒng)進(jìn)行升級。 (4)隱藏細(xì)節(jié)。(5)獨(dú)立于編程語言。 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)鏈接庫項(xiàng)目增加如下兩個函數(shù):為該動態(tài)鏈接庫項(xiàng)目增加如下兩個函數(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)鏈接庫項(xiàng)目文件名),將自動生成
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í)行空間,從而實(shí)現(xiàn)了代碼的重用。 2動態(tài)載入DLL 動態(tài)載入方式是指在編譯之前并不知道將會調(diào)用哪些DLL函數(shù),完全是在運(yùn)行過程中根據(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ù)的運(yùn)行界面如圖10-5所示。程序運(yùn)行時輸入三個數(shù)到三個編輯框中,然后按【求最大值】按鈕,將會求出三個數(shù)的最大值并顯示在第四個文本框中,如果按【求最小值】按鈕,將會求出三個數(shù)的最小值并顯示在第四個文本框中。 圖10-4 例10-2程序設(shè)計界面 圖10-5 例10-2程序運(yùn)行界面 2顯式調(diào)用 靜態(tài)調(diào)用DLL中的函數(shù),程序?qū)崿F(xiàn)比較簡單,代碼較少,但也有一些不足,主要表現(xiàn)在
9、:(1)如果加載的DLL文件不存在或者DLL中沒有要引入的例程,程序?qū)⒆詣咏K止運(yùn)行;(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è)計界面和運(yùn)行界面及程序功能同例10-2。10.1.5 在動態(tài)鏈接庫(在動態(tài)鏈接庫(DLL)中實(shí)現(xiàn)窗體重用中實(shí)現(xiàn)窗體重用 利用DLL實(shí)現(xiàn)窗體重用一般需經(jīng)歷以下幾步:(1)在Delphi的集成開發(fā)環(huán)境中,設(shè)計出需要重用的窗體;(2)編寫一個用于輸出的函數(shù)或過程,在該函數(shù)或過程中,對設(shè)計的窗體進(jìn)行創(chuàng)建使它實(shí)例化;(3)如果要把多個窗體編譯在一個DLL文件中,可重復(fù)(1)和(2),直到所有需要的窗體建立完畢,所有對窗體進(jìn)行實(shí)例化的函數(shù)或過程創(chuàng)建完畢;(4)為適應(yīng)生成.DLL文件的需要
11、,對工程文件進(jìn)行相應(yīng)修改;(5)編譯工程文件以生成DLL文件;(6)在需要該窗體的其它應(yīng)用程序中重用該窗體。 【例10-4】 在許多應(yīng)用程序中都有在兩個列表框中移動選項(xiàng)的窗體,請?jiān)O(shè)計一個這樣的可重用窗體,設(shè)計界面如圖10-6所示。該窗體運(yùn)行時,在左邊的列表框中選中若干個選項(xiàng)后按【】按鈕,將把選中的選項(xiàng)移動到右邊的列表框中;在右邊的列表框中選中若干個選項(xiàng)后按【】按鈕將把左邊的列表框中的所有選項(xiàng)移動到右邊的列表框中;按【】按鈕將把右邊的列表框中的所有選項(xiàng)移動到左邊的列表框中。然后再編寫一個應(yīng)用程序用來調(diào)用該窗體。 圖10-6 設(shè)計界面 為完成本題的功能,應(yīng)經(jīng)歷以下步驟。 (1)設(shè)計窗體。 新建一個
12、應(yīng)用程序,按圖10-6所示給Form1添加組件對象。(2)編寫輸出函數(shù)或過程,實(shí)例化窗體。(3)修改工程文件,使之能生成DLL文件 窗體單元編制完成之后,可把應(yīng)用程序項(xiàng)目轉(zhuǎn)換為DLL。首先執(zhí)行【Proiect】【View】 Source】命令來打開.dpr項(xiàng)目文件,并在代碼編輯器中做如下修改: 把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 程序的運(yùn)行結(jié)果界面 10.2 典型實(shí)例練能力 10.2.1 典型實(shí)例一:顯式調(diào)用動態(tài)鏈接庫中的典型實(shí)例一:顯式調(diào)用動態(tài)鏈接庫中的 多種形式的函數(shù)多種形式的函數(shù) 【實(shí)例題目】 編寫一個動態(tài)鏈接庫文件,取名為FUNDLL4,該庫中有三個函數(shù)AlphNum、DigNum和HuiWen,它們的功能分別是求出字符中字母字符的個數(shù)、數(shù)字字符的個數(shù)和字符串是否為回文
14、。然后編寫一個項(xiàng)目文件,在該項(xiàng)目文件中對這三個函數(shù)進(jìn)行調(diào)用。要求:在項(xiàng)目文件中采用顯式調(diào)用的方法調(diào)用動態(tài)鏈接庫中的函數(shù)。程序的設(shè)計界面與運(yùn)行界面分別如圖10-10和圖10-11所示。程序執(zhí)行時在Edit1編輯框中輸入字符串,接著在ComboBox1復(fù)選框中選擇操作種類,然后單擊【執(zhí)行操作】按鈕將調(diào)用相應(yīng)的函數(shù),得到執(zhí)行結(jié)果。 圖10-10 程序設(shè)計界面 圖10-11 程序運(yùn)行界面 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àng)目拆遷補(bǔ)償與房屋置換買賣合同樣本
- 2025年幼兒園家委會伙委會活動后勤副園長致辭:攜手守護(hù)“食”光共筑健康未來
- 2025至2030年中國螃蜞酥市場分析及競爭策略研究報告
- 2025至2030年中國加侖邊毛巾碟市場分析及競爭策略研究報告
- 廣東省普通高中2010年1月學(xué)業(yè)水平考試(生物)
- 女神節(jié)活動大促活動方案
- 女鞋開業(yè)活動方案
- 女工化妝活動方案
- 婚紗攝影現(xiàn)場活動方案
- 學(xué)校開展選秀活動方案
- 黨課課件含講稿:以作風(fēng)建設(shè)新成效激發(fā)干事創(chuàng)業(yè)新作為
- GB/T 23858-2009檢查井蓋
- 廣告公司客戶回訪表
- 內(nèi)力組合計算表(自動版)
- 慢性頸內(nèi)動脈閉塞血管內(nèi)再通治療評估與技術(shù)課件
- 《心理健康與職業(yè)生涯》期末考試題庫含答案
- 模板攤銷計算規(guī)則
- FANUC機(jī)器人培訓(xùn)教程(完成版)(PPT134頁)
- 危險化學(xué)品企業(yè)安全生產(chǎn)應(yīng)急管理值班值守制度管理辦法
- 耐張線夾壓接工藝
- 輸煤皮帶著火事故處置演練
評論
0/150
提交評論