




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第10章章 動(dòng)態(tài)鏈接庫(kù)(動(dòng)態(tài)鏈接庫(kù)(DLL) 應(yīng)用編程應(yīng)用編程 本章要點(diǎn): 動(dòng)態(tài)鏈接庫(kù)(DLL)的概念 動(dòng)態(tài)鏈接庫(kù)的編寫(xiě) 動(dòng)態(tài)鏈接庫(kù)的隱式調(diào)用和顯示調(diào)用 利用動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)窗體重用的方法10.1 循序漸進(jìn)學(xué)理論 10.1.1 動(dòng)態(tài)鏈接庫(kù)(動(dòng)態(tài)鏈接庫(kù)(DLL)概述)概述 1DLL的概念 DLL是一個(gè)可以執(zhí)行的并可以被多個(gè)Windows應(yīng)用程序共享的程序模塊(稱為Module),模塊中包含了一些可以被多個(gè)Windows應(yīng)用程序或DLL共享的代碼、數(shù)據(jù)和資源。 動(dòng)態(tài)連接庫(kù)文件的擴(kuò)展名一般是dll,也有可能是drv,sys和fon(它們分別對(duì)應(yīng)的是設(shè)備驅(qū)動(dòng)文件、系統(tǒng)文件和字體資源文件)。 2靜態(tài)鏈接
2、和動(dòng)態(tài)鏈接 (1)靜態(tài)鏈接 傳統(tǒng)的庫(kù)函數(shù)是通過(guò)靜態(tài)鏈接鏈到應(yīng)用程序中的。這些庫(kù)函數(shù)可能來(lái)自編程語(yǔ)言提供的標(biāo)準(zhǔn)庫(kù),也可能是由操作系統(tǒng)提供的API。 (2)動(dòng)態(tài)鏈接 動(dòng)態(tài)鏈接是指在把應(yīng)用程序的目標(biāo)代碼鏈接成EXE文件時(shí)并沒(méi)有將函數(shù)庫(kù)中的函數(shù)復(fù)制到應(yīng)用程序的可執(zhí)行文件中,而是在程序運(yùn)行時(shí)動(dòng)態(tài)地加載所需的函數(shù)。 3使用DLL的優(yōu)點(diǎn) 使用動(dòng)態(tài)鏈接庫(kù)還有以下優(yōu)點(diǎn): (1)應(yīng)用范圍廣。 (2)便于開(kāi)發(fā)大型軟件。 (3)便于對(duì)系統(tǒng)進(jìn)行升級(jí)。 (4)隱藏細(xì)節(jié)。(5)獨(dú)立于編程語(yǔ)言。 10.1.2 動(dòng)態(tài)鏈接庫(kù)(動(dòng)態(tài)鏈接庫(kù)(DLL)編寫(xiě))編寫(xiě) 根據(jù)動(dòng)態(tài)鏈接庫(kù)完成的功能,可把DLL分成三類:完成一般功能的DLL、用于
3、數(shù)據(jù)交換的DLL和用于窗體重用的DLL。 【例10-1】創(chuàng)建一個(gè)動(dòng)態(tài)鏈接庫(kù),該動(dòng)態(tài)鏈接庫(kù)中包含兩個(gè)函數(shù),分別用于求三個(gè)數(shù)的最大值和最小值。為編寫(xiě)該動(dòng)態(tài)鏈接庫(kù),需經(jīng)過(guò)以下步驟: (1)建立DLL程序框架 在Delphi 7.0集成環(huán)境中,執(zhí)行【File】【New】【Other】命令,將會(huì)出現(xiàn)【New Items】對(duì)話框窗口,在該窗口中找到【DLL Wizard】圖標(biāo),如圖10-3所示。 圖10-3 “New Items”對(duì)話框 2建立過(guò)程和函數(shù) 為該動(dòng)態(tài)鏈接庫(kù)項(xiàng)目增加如下兩個(gè)函數(shù):為該動(dòng)態(tài)鏈接庫(kù)項(xiàng)目增加如下兩個(gè)函數(shù): Function Max(x,y,z:Integer):Integer;std
4、call;/求三個(gè)數(shù)的最大值函數(shù) Function Min(x,y,z:Integer):Integer;stdcall;/求三個(gè)數(shù)的最小值函數(shù) (3)用exports語(yǔ)句聲明供其它應(yīng)用程序 調(diào)用的函數(shù)和過(guò)程名 函數(shù)或過(guò)程定義好后,為了能夠被其它應(yīng)用程序調(diào)用,還必須用Exports子句把函數(shù)名列出。本例使用的Exports語(yǔ)句如下:exports Max,Min;Exports語(yǔ)句的格式與功能如下:exportsentry1,entry2,entryn; (4)生成DLL文件執(zhí)行【Project】【Build Exam_10_1】命令(“Exam_10_1”為動(dòng)態(tài)鏈接庫(kù)項(xiàng)目文件名),將自動(dòng)生成
5、名為“Exam_10_1.dll”的動(dòng)態(tài)鏈接庫(kù)文件。 10.1.3 加載動(dòng)態(tài)鏈接庫(kù)(加載動(dòng)態(tài)鏈接庫(kù)(DLL)的方法)的方法 1靜態(tài)載入DLL 這種方法是將DLL文件映像映射到調(diào)用進(jìn)程地址空間的最簡(jiǎn)單的辦法。 靜態(tài)載入DLL的前提是在編譯之前已經(jīng)明確知道要調(diào)用DLL中的哪幾個(gè)函數(shù),編譯時(shí)在目標(biāo)文件中只保留必要的鏈接信息,而不包含DLL函數(shù)的代碼。在程序執(zhí)行時(shí),利用鏈接信息加載DLL函數(shù)代碼并在內(nèi)存中將其鏈接進(jìn)入調(diào)用程序的執(zhí)行空間,從而實(shí)現(xiàn)了代碼的重用。 2動(dòng)態(tài)載入DLL 動(dòng)態(tài)載入方式是指在編譯之前并不知道將會(huì)調(diào)用哪些DLL函數(shù),完全是在運(yùn)行過(guò)程中根據(jù)需要決定應(yīng)調(diào)用哪些函數(shù),并用LoadLibra
6、ry函數(shù)加載動(dòng)態(tài)鏈接庫(kù)到內(nèi)存,用GetProcAddress函數(shù)動(dòng)態(tài)獲得DLL函數(shù)的入口地址。 動(dòng)態(tài)調(diào)用使用的Windows API函數(shù)主要有3個(gè),分別是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指定的過(guò)程或函數(shù)的入口地址。(3)FreeLibrary函數(shù) 格式:procedure FreeLibrary(Module:Thandle);功能:將由參數(shù)Module指定的DLL文件從內(nèi)存中卸載1次。 10.1.4 調(diào)用動(dòng)態(tài)鏈接庫(kù)(調(diào)用動(dòng)態(tài)鏈接庫(kù)(DLL)中的過(guò)程和函數(shù)中的過(guò)程和函數(shù) 在應(yīng)用程序中,調(diào)用動(dòng)態(tài)鏈接庫(kù)也有兩種方法。分別是隱式調(diào)用和顯示調(diào)用。 1隱式調(diào)用 隱式調(diào)用又稱靜態(tài)調(diào)用或裝載時(shí)調(diào)用,對(duì)應(yīng)于DLL的靜態(tài)載入。要在應(yīng)用程序中隱式調(diào)用某個(gè)動(dòng)態(tài)鏈接庫(kù)中的函數(shù),一般要做以下兩件事情:(1)用extern子句聲明要調(diào)用的過(guò)程或
8、函數(shù)及其所在的DLL文件名;(2)在應(yīng)用程序中直接調(diào)用用extern子句聲明的過(guò)程。 【例10-2】 編寫(xiě)一個(gè)應(yīng)用程序用來(lái)調(diào)用例10-1所建立的動(dòng)態(tài)鏈接庫(kù)中的Max和Min函數(shù),要求使用隱式調(diào)用。程序的設(shè)計(jì)界面如圖10-4所示,函數(shù)的運(yùn)行界面如圖10-5所示。程序運(yùn)行時(shí)輸入三個(gè)數(shù)到三個(gè)編輯框中,然后按【求最大值】按鈕,將會(huì)求出三個(gè)數(shù)的最大值并顯示在第四個(gè)文本框中,如果按【求最小值】按鈕,將會(huì)求出三個(gè)數(shù)的最小值并顯示在第四個(gè)文本框中。 圖10-4 例10-2程序設(shè)計(jì)界面 圖10-5 例10-2程序運(yùn)行界面 2顯式調(diào)用 靜態(tài)調(diào)用DLL中的函數(shù),程序?qū)崿F(xiàn)比較簡(jiǎn)單,代碼較少,但也有一些不足,主要表現(xiàn)在
9、:(1)如果加載的DLL文件不存在或者DLL中沒(méi)有要引入的例程,程序?qū)⒆詣?dòng)終止運(yùn)行;(2)DLL文件一旦加載就一直駐留在應(yīng)用程序的地址空間,即使后面已不再使用它了。 顯式調(diào)用動(dòng)態(tài)鏈接庫(kù)中的函數(shù)一般需經(jīng)歷以下步驟:(1)定義一個(gè)與調(diào)用函數(shù)一致的函數(shù)類型;(2)用LoadLibrary或SafeLoadLibrary函數(shù)動(dòng)態(tài)載入動(dòng)態(tài)鏈接庫(kù);(3)用GetProcAddress得到要調(diào)用的函數(shù)或過(guò)程的地址;(4)利用定義的函數(shù)類型生成一個(gè)同類型的函數(shù)變量(本題為Myfunct);(5)進(jìn)行函數(shù)調(diào)用(本題調(diào)用語(yǔ)句為:Myfunct(x,y,z););(6)利用FreeLibrary函數(shù)卸載動(dòng)態(tài)鏈接庫(kù)。
10、 【例10-3】 編寫(xiě)一個(gè)應(yīng)用程序用來(lái)調(diào)用例10-1所建立的動(dòng)態(tài)鏈接庫(kù)中的Max和Min函數(shù),要求使用顯示調(diào)用。程序的設(shè)計(jì)界面和運(yùn)行界面及程序功能同例10-2。10.1.5 在動(dòng)態(tài)鏈接庫(kù)(在動(dòng)態(tài)鏈接庫(kù)(DLL)中實(shí)現(xiàn)窗體重用中實(shí)現(xiàn)窗體重用 利用DLL實(shí)現(xiàn)窗體重用一般需經(jīng)歷以下幾步:(1)在Delphi的集成開(kāi)發(fā)環(huán)境中,設(shè)計(jì)出需要重用的窗體;(2)編寫(xiě)一個(gè)用于輸出的函數(shù)或過(guò)程,在該函數(shù)或過(guò)程中,對(duì)設(shè)計(jì)的窗體進(jìn)行創(chuàng)建使它實(shí)例化;(3)如果要把多個(gè)窗體編譯在一個(gè)DLL文件中,可重復(fù)(1)和(2),直到所有需要的窗體建立完畢,所有對(duì)窗體進(jìn)行實(shí)例化的函數(shù)或過(guò)程創(chuàng)建完畢;(4)為適應(yīng)生成.DLL文件的需要
11、,對(duì)工程文件進(jìn)行相應(yīng)修改;(5)編譯工程文件以生成DLL文件;(6)在需要該窗體的其它應(yīng)用程序中重用該窗體。 【例10-4】 在許多應(yīng)用程序中都有在兩個(gè)列表框中移動(dòng)選項(xiàng)的窗體,請(qǐng)?jiān)O(shè)計(jì)一個(gè)這樣的可重用窗體,設(shè)計(jì)界面如圖10-6所示。該窗體運(yùn)行時(shí),在左邊的列表框中選中若干個(gè)選項(xiàng)后按【】按鈕,將把選中的選項(xiàng)移動(dòng)到右邊的列表框中;在右邊的列表框中選中若干個(gè)選項(xiàng)后按【】按鈕將把左邊的列表框中的所有選項(xiàng)移動(dòng)到右邊的列表框中;按【】按鈕將把右邊的列表框中的所有選項(xiàng)移動(dòng)到左邊的列表框中。然后再編寫(xiě)一個(gè)應(yīng)用程序用來(lái)調(diào)用該窗體。 圖10-6 設(shè)計(jì)界面 為完成本題的功能,應(yīng)經(jīng)歷以下步驟。 (1)設(shè)計(jì)窗體。 新建一個(gè)
12、應(yīng)用程序,按圖10-6所示給Form1添加組件對(duì)象。(2)編寫(xiě)輸出函數(shù)或過(guò)程,實(shí)例化窗體。(3)修改工程文件,使之能生成DLL文件 窗體單元編制完成之后,可把應(yīng)用程序項(xiàng)目轉(zhuǎn)換為DLL。首先執(zhí)行【Proiect】【View】 Source】命令來(lái)打開(kāi).dpr項(xiàng)目文件,并在代碼編輯器中做如下修改: 把program改為L(zhǎng)ibrary; 從Uses指令中刪除Forms; 在$R資源指令和工程的uses指令的最后一行之間,插入關(guān)鍵字export,后跟單元的訪問(wèn)過(guò)程或函數(shù)名稱(在本例中,就是ListMoveF),如果有多個(gè)窗體要重用,可列出多個(gè)函數(shù)或過(guò)程名; 刪除begin和end之間的所有語(yǔ)句,讓初始
13、化代碼塊留空。 (4)生成DLL文件 執(zhí)行【Project】【Build EXAMDLL】命令,生成EXAMDLL.DLL動(dòng)態(tài)鏈接庫(kù)文件。 (5)編寫(xiě)一個(gè)應(yīng)用程序調(diào)用該窗體 圖10-7 調(diào)用程序設(shè)計(jì)界面 圖10-8 彈出的可重用窗體 圖10-9 程序的運(yùn)行結(jié)果界面 10.2 典型實(shí)例練能力 10.2.1 典型實(shí)例一:顯式調(diào)用動(dòng)態(tài)鏈接庫(kù)中的典型實(shí)例一:顯式調(diào)用動(dòng)態(tài)鏈接庫(kù)中的 多種形式的函數(shù)多種形式的函數(shù) 【實(shí)例題目】 編寫(xiě)一個(gè)動(dòng)態(tài)鏈接庫(kù)文件,取名為FUNDLL4,該庫(kù)中有三個(gè)函數(shù)AlphNum、DigNum和HuiWen,它們的功能分別是求出字符中字母字符的個(gè)數(shù)、數(shù)字字符的個(gè)數(shù)和字符串是否為回文
14、。然后編寫(xiě)一個(gè)項(xiàng)目文件,在該項(xiàng)目文件中對(duì)這三個(gè)函數(shù)進(jìn)行調(diào)用。要求:在項(xiàng)目文件中采用顯式調(diào)用的方法調(diào)用動(dòng)態(tài)鏈接庫(kù)中的函數(shù)。程序的設(shè)計(jì)界面與運(yùn)行界面分別如圖10-10和圖10-11所示。程序執(zhí)行時(shí)在Edit1編輯框中輸入字符串,接著在ComboBox1復(fù)選框中選擇操作種類,然后單擊【執(zhí)行操作】按鈕將調(diào)用相應(yīng)的函數(shù),得到執(zhí)行結(jié)果。 圖10-10 程序設(shè)計(jì)界面 圖10-11 程序運(yùn)行界面 10.3 上機(jī)練習(xí)重應(yīng)用 10.3.1 上機(jī)練習(xí)一:一維數(shù)組求值相關(guān)算法動(dòng)上機(jī)練習(xí)一:一維數(shù)組求值相關(guān)算法動(dòng) 態(tài)鏈接庫(kù)的編制態(tài)鏈接庫(kù)的編制 【練習(xí)【練習(xí)題目題目】 編寫(xiě)一個(gè)動(dòng)態(tài)鏈接庫(kù)MyDLL.DLL,為該動(dòng)態(tài)鏈接庫(kù)創(chuàng)建四個(gè)函數(shù)Max、Min、Sum和Aver,分別用來(lái)求具有N(參數(shù))個(gè)元素的一維數(shù)組的最大值、最小值、總和及平均值。然后再創(chuàng)建一個(gè)應(yīng)用程序,通過(guò)對(duì)這些函
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 倉(cāng)儲(chǔ)規(guī)劃師崗位面試問(wèn)題及答案
- 浙江省杭州七縣區(qū)2025屆化學(xué)高二下期末學(xué)業(yè)質(zhì)量監(jiān)測(cè)試題含解析
- 2025屆寧夏銀川市第六中學(xué)高一化學(xué)第二學(xué)期期末預(yù)測(cè)試題含解析
- 北京市清華大學(xué)附中2025年化學(xué)高二下期末綜合測(cè)試試題含解析
- 江西省新余第四中學(xué)、上高第二中學(xué)2025屆高一化學(xué)第二學(xué)期期末聯(lián)考試題含解析
- 發(fā)票搖獎(jiǎng)資金管理辦法
- 園區(qū)企業(yè)梯隊(duì)管理辦法
- 江蘇工地進(jìn)度管理辦法
- 佛教用品規(guī)范管理辦法
- 農(nóng)業(yè)公司戰(zhàn)略管理辦法
- 2025年度職業(yè)技能鑒定國(guó)家題庫(kù)維修電工高級(jí)技師復(fù)習(xí)題庫(kù)及答案(完整版)
- 項(xiàng)目管理班子配備情況
- 精選常熟市化工企業(yè)名單
- GB/T 3723-1999工業(yè)用化學(xué)產(chǎn)品采樣安全通則
- FZ/T 73044-2012針織配飾品
- 長(zhǎng)白綠葉冰泉人參飲料商業(yè)計(jì)劃書(shū)0714
- 船舶修理92黃本
- 安措費(fèi)使用計(jì)劃報(bào)審表(施工報(bào)-監(jiān)理審-業(yè)主批)
- Q∕SY 02625.2-2018 油氣水井帶壓作業(yè)技術(shù)規(guī)范 第2部分:設(shè)備配備、使用與維護(hù)
- 調(diào)研報(bào)告:農(nóng)村糧食經(jīng)紀(jì)人現(xiàn)狀、存在問(wèn)題及建議
- 鋼筋平行檢驗(yàn)記錄范本
評(píng)論
0/150
提交評(píng)論