動態鏈接庫(DLL)應用_第1頁
動態鏈接庫(DLL)應用_第2頁
動態鏈接庫(DLL)應用_第3頁
動態鏈接庫(DLL)應用_第4頁
動態鏈接庫(DLL)應用_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第第10章章 動態鏈接庫(動態鏈接庫(DLL) 應用編程應用編程 本章要點: 動態鏈接庫(DLL)的概念 動態鏈接庫的編寫 動態鏈接庫的隱式調用和顯示調用 利用動態鏈接庫實現窗體重用的方法10.1 循序漸進學理論 10.1.1 動態鏈接庫(動態鏈接庫(DLL)概述)概述 1DLL的概念 DLL是一個可以執行的并可以被多個Windows應用程序共享的程序模塊(稱為Module),模塊中包含了一些可以被多個Windows應用程序或DLL共享的代碼、數據和資源。 動態連接庫文件的擴展名一般是dll,也有可能是drv,sys和fon(它們分別對應的是設備驅動文件、系統文件和字體資源文件)。 2靜態鏈接

2、和動態鏈接 (1)靜態鏈接 傳統的庫函數是通過靜態鏈接鏈到應用程序中的。這些庫函數可能來自編程語言提供的標準庫,也可能是由操作系統提供的API。 (2)動態鏈接 動態鏈接是指在把應用程序的目標代碼鏈接成EXE文件時并沒有將函數庫中的函數復制到應用程序的可執行文件中,而是在程序運行時動態地加載所需的函數。 3使用DLL的優點 使用動態鏈接庫還有以下優點: (1)應用范圍廣。 (2)便于開發大型軟件。 (3)便于對系統進行升級。 (4)隱藏細節。(5)獨立于編程語言。 10.1.2 動態鏈接庫(動態鏈接庫(DLL)編寫)編寫 根據動態鏈接庫完成的功能,可把DLL分成三類:完成一般功能的DLL、用于

3、數據交換的DLL和用于窗體重用的DLL。 【例10-1】創建一個動態鏈接庫,該動態鏈接庫中包含兩個函數,分別用于求三個數的最大值和最小值。為編寫該動態鏈接庫,需經過以下步驟: (1)建立DLL程序框架 在Delphi 7.0集成環境中,執行【File】【New】【Other】命令,將會出現【New Items】對話框窗口,在該窗口中找到【DLL Wizard】圖標,如圖10-3所示。 圖10-3 “New Items”對話框 2建立過程和函數 為該動態鏈接庫項目增加如下兩個函數:為該動態鏈接庫項目增加如下兩個函數: Function Max(x,y,z:Integer):Integer;std

4、call;/求三個數的最大值函數 Function Min(x,y,z:Integer):Integer;stdcall;/求三個數的最小值函數 (3)用exports語句聲明供其它應用程序 調用的函數和過程名 函數或過程定義好后,為了能夠被其它應用程序調用,還必須用Exports子句把函數名列出。本例使用的Exports語句如下:exports Max,Min;Exports語句的格式與功能如下:exportsentry1,entry2,entryn; (4)生成DLL文件執行【Project】【Build Exam_10_1】命令(“Exam_10_1”為動態鏈接庫項目文件名),將自動生成

5、名為“Exam_10_1.dll”的動態鏈接庫文件。 10.1.3 加載動態鏈接庫(加載動態鏈接庫(DLL)的方法)的方法 1靜態載入DLL 這種方法是將DLL文件映像映射到調用進程地址空間的最簡單的辦法。 靜態載入DLL的前提是在編譯之前已經明確知道要調用DLL中的哪幾個函數,編譯時在目標文件中只保留必要的鏈接信息,而不包含DLL函數的代碼。在程序執行時,利用鏈接信息加載DLL函數代碼并在內存中將其鏈接進入調用程序的執行空間,從而實現了代碼的重用。 2動態載入DLL 動態載入方式是指在編譯之前并不知道將會調用哪些DLL函數,完全是在運行過程中根據需要決定應調用哪些函數,并用LoadLibra

6、ry函數加載動態鏈接庫到內存,用GetProcAddress函數動態獲得DLL函數的入口地址。 動態調用使用的Windows API函數主要有3個,分別是LoadLibrary、GetProcAddress和FreeLibrary。 (1)LoadLibrary函數 格式:functionLoadLibrary(LibFileName:PChar):Thandle;功能:加載由參數LibFileName指定的DLL文件。 (2)GetProcAddress函數格式:functionGetProcAddress(Module:Thandle;ProcName:PChar):TfarProc; 功

7、能:返回參數Module指定的模塊中,由參數ProcName指定的過程或函數的入口地址。(3)FreeLibrary函數 格式:procedure FreeLibrary(Module:Thandle);功能:將由參數Module指定的DLL文件從內存中卸載1次。 10.1.4 調用動態鏈接庫(調用動態鏈接庫(DLL)中的過程和函數中的過程和函數 在應用程序中,調用動態鏈接庫也有兩種方法。分別是隱式調用和顯示調用。 1隱式調用 隱式調用又稱靜態調用或裝載時調用,對應于DLL的靜態載入。要在應用程序中隱式調用某個動態鏈接庫中的函數,一般要做以下兩件事情:(1)用extern子句聲明要調用的過程或

8、函數及其所在的DLL文件名;(2)在應用程序中直接調用用extern子句聲明的過程。 【例10-2】 編寫一個應用程序用來調用例10-1所建立的動態鏈接庫中的Max和Min函數,要求使用隱式調用。程序的設計界面如圖10-4所示,函數的運行界面如圖10-5所示。程序運行時輸入三個數到三個編輯框中,然后按【求最大值】按鈕,將會求出三個數的最大值并顯示在第四個文本框中,如果按【求最小值】按鈕,將會求出三個數的最小值并顯示在第四個文本框中。 圖10-4 例10-2程序設計界面 圖10-5 例10-2程序運行界面 2顯式調用 靜態調用DLL中的函數,程序實現比較簡單,代碼較少,但也有一些不足,主要表現在

9、:(1)如果加載的DLL文件不存在或者DLL中沒有要引入的例程,程序將自動終止運行;(2)DLL文件一旦加載就一直駐留在應用程序的地址空間,即使后面已不再使用它了。 顯式調用動態鏈接庫中的函數一般需經歷以下步驟:(1)定義一個與調用函數一致的函數類型;(2)用LoadLibrary或SafeLoadLibrary函數動態載入動態鏈接庫;(3)用GetProcAddress得到要調用的函數或過程的地址;(4)利用定義的函數類型生成一個同類型的函數變量(本題為Myfunct);(5)進行函數調用(本題調用語句為:Myfunct(x,y,z););(6)利用FreeLibrary函數卸載動態鏈接庫。

10、 【例10-3】 編寫一個應用程序用來調用例10-1所建立的動態鏈接庫中的Max和Min函數,要求使用顯示調用。程序的設計界面和運行界面及程序功能同例10-2。10.1.5 在動態鏈接庫(在動態鏈接庫(DLL)中實現窗體重用中實現窗體重用 利用DLL實現窗體重用一般需經歷以下幾步:(1)在Delphi的集成開發環境中,設計出需要重用的窗體;(2)編寫一個用于輸出的函數或過程,在該函數或過程中,對設計的窗體進行創建使它實例化;(3)如果要把多個窗體編譯在一個DLL文件中,可重復(1)和(2),直到所有需要的窗體建立完畢,所有對窗體進行實例化的函數或過程創建完畢;(4)為適應生成.DLL文件的需要

11、,對工程文件進行相應修改;(5)編譯工程文件以生成DLL文件;(6)在需要該窗體的其它應用程序中重用該窗體。 【例10-4】 在許多應用程序中都有在兩個列表框中移動選項的窗體,請設計一個這樣的可重用窗體,設計界面如圖10-6所示。該窗體運行時,在左邊的列表框中選中若干個選項后按【】按鈕,將把選中的選項移動到右邊的列表框中;在右邊的列表框中選中若干個選項后按【】按鈕將把左邊的列表框中的所有選項移動到右邊的列表框中;按【】按鈕將把右邊的列表框中的所有選項移動到左邊的列表框中。然后再編寫一個應用程序用來調用該窗體。 圖10-6 設計界面 為完成本題的功能,應經歷以下步驟。 (1)設計窗體。 新建一個

12、應用程序,按圖10-6所示給Form1添加組件對象。(2)編寫輸出函數或過程,實例化窗體。(3)修改工程文件,使之能生成DLL文件 窗體單元編制完成之后,可把應用程序項目轉換為DLL。首先執行【Proiect】【View】 Source】命令來打開.dpr項目文件,并在代碼編輯器中做如下修改: 把program改為Library; 從Uses指令中刪除Forms; 在$R資源指令和工程的uses指令的最后一行之間,插入關鍵字export,后跟單元的訪問過程或函數名稱(在本例中,就是ListMoveF),如果有多個窗體要重用,可列出多個函數或過程名; 刪除begin和end之間的所有語句,讓初始

13、化代碼塊留空。 (4)生成DLL文件 執行【Project】【Build EXAMDLL】命令,生成EXAMDLL.DLL動態鏈接庫文件。 (5)編寫一個應用程序調用該窗體 圖10-7 調用程序設計界面 圖10-8 彈出的可重用窗體 圖10-9 程序的運行結果界面 10.2 典型實例練能力 10.2.1 典型實例一:顯式調用動態鏈接庫中的典型實例一:顯式調用動態鏈接庫中的 多種形式的函數多種形式的函數 【實例題目】 編寫一個動態鏈接庫文件,取名為FUNDLL4,該庫中有三個函數AlphNum、DigNum和HuiWen,它們的功能分別是求出字符中字母字符的個數、數字字符的個數和字符串是否為回文

14、。然后編寫一個項目文件,在該項目文件中對這三個函數進行調用。要求:在項目文件中采用顯式調用的方法調用動態鏈接庫中的函數。程序的設計界面與運行界面分別如圖10-10和圖10-11所示。程序執行時在Edit1編輯框中輸入字符串,接著在ComboBox1復選框中選擇操作種類,然后單擊【執行操作】按鈕將調用相應的函數,得到執行結果。 圖10-10 程序設計界面 圖10-11 程序運行界面 10.3 上機練習重應用 10.3.1 上機練習一:一維數組求值相關算法動上機練習一:一維數組求值相關算法動 態鏈接庫的編制態鏈接庫的編制 【練習【練習題目題目】 編寫一個動態鏈接庫MyDLL.DLL,為該動態鏈接庫創建四個函數Max、Min、Sum和Aver,分別用來求具有N(參數)個元素的一維數組的最大值、最小值、總和及平均值。然后再創建一個應用程序,通過對這些函

溫馨提示

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

最新文檔

評論

0/150

提交評論