資源描述:
《delphi的dll編程》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、1.1Windows的動態(tài)鏈接庫原理動態(tài)鏈接庫(DLLs)是從C語言函數(shù)庫和Pascal庫單元的概念發(fā)展而來的。所有的C語言標準庫函數(shù)都存放在某一函數(shù)庫中,同時用戶也可以用LIB程序創(chuàng)建自己的函數(shù)庫。在鏈接應用程序的過程中,鏈接器從庫文件中拷貝程序調(diào)用的函數(shù)代碼,并把這些函數(shù)代碼添加到可執(zhí)行文件中。這種方法同只把函數(shù)儲存在已編譯的.OBJ文件中相比更有利于代碼的重用。但隨著Windows這樣的多任務環(huán)境的出現(xiàn),函數(shù)庫的方法顯得過于累贅。如果為了完成屏幕輸出、消息處理、內(nèi)存管理、對話框等操作,每個程序都不得不擁有自己
2、的函數(shù),那么Windows程序將變得非常龐大。Windows的發(fā)展要求允許同時運行的幾個程序共享一組函數(shù)的單一拷貝。動態(tài)鏈接庫就是在這種情況下出現(xiàn)的。動態(tài)鏈接庫不用重復編譯或鏈接,一旦裝入內(nèi)存,Dlls函數(shù)可以被系統(tǒng)中的任何正在運行的應用程序軟件所使用,而不必再將DLLs函數(shù)的另一拷貝裝入內(nèi)存。1.1.1動態(tài)鏈接庫的工作原理“動態(tài)鏈接”這幾字指明了DLLs是如何工作的。對于常規(guī)的函數(shù)庫,鏈接器從中拷貝它需要的所有庫函數(shù),并把確切的函數(shù)地址傳送給調(diào)用這些函數(shù)的程序。而對于DLLs,函數(shù)儲存在一個獨立的動態(tài)鏈接庫文件中
3、。在創(chuàng)建Windows程序時,鏈接過程并不把DLLs文件鏈接到程序上。直到程序運行并調(diào)用一個DLLs中的函數(shù)時,該程序才要求這個函數(shù)的地址。此時Windows才在DLLs中尋找被調(diào)用函數(shù),并把它的地址傳送給調(diào)用程序。采用這種方法,DLLs達到了復用代碼的極限。動態(tài)鏈接庫的另一個方便之處是對動態(tài)鏈接庫中函數(shù)的修改可以自動傳播到所有調(diào)用它的程序中,而不必對程序作任何改動或處理。DLLs不僅提供了函數(shù)重用的機制,而且提供了數(shù)據(jù)共享的機制。任何應用程序都可以共享由裝入內(nèi)存的DLLs管理的內(nèi)存資源塊。只包含共享數(shù)據(jù)的DLLs
4、稱為資源文件。如Windows的字體文件等。1.1.2Windows系統(tǒng)的動態(tài)鏈接庫Windows本身就是由大量的動態(tài)鏈接庫支持的。這包括WindowsAPI函數(shù)(KRNLx86.EXE,USER.EXE,GDI.EXE,…),各種驅動程序文件,各種帶有.Fon和.Fot擴展名的字體資源文件等。Windows還提供了針對某一功能的專用DLLs,如進行DDE編程的ddeml.dll,進行程序安裝的ver.dll等。雖然在編寫Windows程序時必然要涉及到DLLs,但利用Delphi,用戶在大部分時候并不會注意到這一
5、點。這一方面是因為Delphi提供了豐富的函數(shù)使用戶不必直接去使用WindowsAPI;另一方面即使使用WindowsAPI,由于Delphi把API函數(shù)和其它WindowsDLLs函數(shù)重新組織到了幾個庫單元中,因而也不必使用特殊的調(diào)用格式。所以本章的重點放在編寫和調(diào)用用戶自定義的DLLs上。使用傳統(tǒng)的Windows編程方法來創(chuàng)建和使用一個DLLs是一件很令人頭痛的事,正如傳統(tǒng)的Windows編程方法本身就令人生畏一樣。用戶需要對定義文件、工程文件進行一系列的修改以適應創(chuàng)建和使用DLLs的需要。Delphi的出現(xiàn),
6、在這一方面,正如在其它許多方面所做的那樣,減輕了開發(fā)者的負擔。更令人興奮的是Delphi利用DLLs實現(xiàn)了窗體的重用機制。用戶可以將自己設計好的窗體儲存在一個DLLs中,在需要的時候可隨時調(diào)用它。1.1DLLs的編寫和調(diào)用1.1.1DLLs的編寫在Delphi環(huán)境中,編寫一個DLLs同編寫一個一般的應用程序并沒有太大的區(qū)別。事實上作為DLLs主體的DLL函數(shù)的編寫,除了在內(nèi)存、資源的管理上有所不同外,并不需要其它特別的手段。真正的區(qū)別在工程文件上。在絕大多數(shù)情況下,用戶幾乎意識不到工程文件的存在,因為它一般不顯示在
7、屏幕上。如果想查看工程文件,則可以打開View菜單選擇ProjectSource項,此時工程文件的代碼就會出現(xiàn)在屏幕的CodeEditor(代碼編輯器)中。一般工程文件的格式為:program工程標題;uses子句;程序體而DLLs工程文件的格式為:library工程標題;uses子句;exprots子句;程序體它們主要的區(qū)別有兩點:1.一般工程文件的頭標用program關鍵字,而DLLs工程文件頭標用library關鍵字。不同的關鍵字通知編譯器生成不同的可執(zhí)行文件。用program關鍵字生成的是.exe文件,而用
8、library關鍵字生成的是.dll文件;2.假如DLLs要輸出供其它應用程序使用的函數(shù)或過程,則必須將這些函數(shù)或過程列在exports子句中。而這些函數(shù)或過程本身必須用export編譯指令進行編譯。根據(jù)DLLs完成的功能,我們把DLLs分為如下的三類:1.完成一般功能的DLLs;2.用于數(shù)據(jù)交換的DLLs;3.用于窗體重用的DLLs。這一節(jié)我們只討論完成一