| 一、開(kāi)使你的第一個(gè)DLL專(zhuān)案 1.File->Close all->File->New﹝DLL﹞
二、所寫(xiě)的函數和過(guò)程應該用exports語(yǔ)句聲明為外部函數。 三、當使用了長(cháng)字符串類(lèi)型的參數、變量時(shí)要引用ShareMem。 調用一個(gè)DLL比寫(xiě)一個(gè)DLL要容易一些。首先給大家介紹的是靜態(tài)調用方法,稍后將介紹動(dòng)態(tài)調用方法,并就兩種方法做一個(gè)比較。同樣的,我們先舉一個(gè)靜態(tài)調用的例子。 unit Unit1; interface uses type var implementation {$R *.DFM} //本行以下代碼為我們真正動(dòng)手寫(xiě)的代碼 function TestDll(i:integer):integer;stdcall; procedure TForm1.Button1Click(Sender: TObject); end. 上面的例子中我們在窗體上放置了一個(gè)編輯框(Edit)和一個(gè)按鈕(Button),并且書(shū)寫(xiě)了很少的代碼來(lái)測試我們剛剛編寫(xiě)的Delphi.dll。大家可以看到我們唯一做的工作是將TestDll函數的說(shuō)明部分放在了implementation中,并且用external語(yǔ)句指定了Delphi.dll的位置。(本例中調用程序和Delphi.dll在同一個(gè)目錄中。)讓人興奮的是,我們自己編寫(xiě)的TestDll函數很快被Delphi認出來(lái)了。您可做這樣一個(gè)實(shí)驗:輸入“TestDll(”,很快Delphi就會(huì )用fly-by提示條提示您應該輸入的參數是什么,就像我們使用Delphi中定義的其他函數一樣簡(jiǎn)單。注意事項有以 一、調用參數用stdcall。 二、用external語(yǔ)句指定被調用的DLL文件的路徑和名稱(chēng)。 三、不能從DLL中調用全局變量。 四、被調用的DLL必須存在。 第四章 在Delphi中動(dòng)態(tài)調用DLL top 動(dòng)態(tài)調用DLL相對復雜很多,但非常靈活。為了全面的說(shuō)明該問(wèn)題,這次我們舉一個(gè)調用由C++編寫(xiě)的DLL的例子。首先在C++中編譯下面的DLL源程序。 #include extern ”C” _declspec(dllexport) 編譯后生成一個(gè)DLL文件,在這里我們稱(chēng)該文件為Cpp.dll,該DLL中只有一個(gè)返回整數類(lèi)型的函數TestC。為了方便說(shuō)明,我們仍然引用上面的調用程序,只是將原來(lái)的Button1Click過(guò)程中的語(yǔ)句用下面的代碼替換掉了。 procedure TForm1.Button1Click(Sender: TObject); 大家已經(jīng)看到了,這種動(dòng)態(tài)調用技術(shù)很復雜,但只要修改參數,如修改LoadLibrary(’Cpp.dll’)中的DLL名稱(chēng)為’Delphi.dll’就可動(dòng)態(tài)更改所調用的DLL。 一、定義所要調用的函數或過(guò)程的類(lèi)型。 二、釋放所調用的DLL。 現在我們來(lái)評價(jià)一下兩種調用DLL的方法的優(yōu)缺點(diǎn)。靜態(tài)方法實(shí)現簡(jiǎn)單,易于掌握并且一般來(lái)說(shuō)稍微快一點(diǎn),也更加安全可靠一些;但是靜態(tài)方法不能靈活地在運行時(shí)裝卸所需的DLL,而是在主程序開(kāi)始運行時(shí)就裝載指定的DLL直到程序結束時(shí)才釋放該DLL,另外只有基于編譯器和鏈接器的系統(如Delphi)才可以使用該方法。動(dòng)態(tài)方法較好地解決了靜態(tài)方法中存在的不足,可以方便地訪(fǎng)問(wèn)DLL中的函數和過(guò)程,甚至一些老版本DLL中新添加的函數或過(guò)程;但動(dòng)態(tài)方法難以完全掌握,使用時(shí)因為不同的函數或過(guò)程要定義很多很復雜的類(lèi)型和調用方法。對于初學(xué)者,筆者建議您使用靜態(tài)方法,待熟練后再使用動(dòng)態(tài)調用方法。 第五章 使用DLL的實(shí)用技巧 top 一、編寫(xiě)技巧。 2 、為了保證DLL的通用性,應該在自己編寫(xiě)的DLL中杜絕出現可視化控件的名稱(chēng),如:Edit1.Text中的Edit1名稱(chēng);或者自定義非Windows定義的類(lèi)型,如某種記錄。 3 、為便于調試,每個(gè)函數和過(guò)程應該盡可能短小精悍,并配合具體詳細的注釋。 4 、應多利用try-finally來(lái)處理可能出現的錯誤和異常,注意這時(shí)要引用SysUtils單元。 5 、盡可能少引用單元以減小DLL的大小,特別是不要引用可視化單元,如Dialogs單元。例如一般情況下,我們可以不引用Classes單元,這樣可使編譯后的DLL減小大約16Kb。 二、調用技巧。 2 、可把我們編寫(xiě)的DLL放到Windows目錄下或者Windows\system目錄下。這樣做可以在external語(yǔ)句中或LoadLibrary語(yǔ)句中不寫(xiě)路徑而只寫(xiě)DLL的名稱(chēng)。但這樣做有些不妥,這兩個(gè)目錄下有大量重要的系統DLL,如果您編的DLL與它們重名的話(huà)其后果簡(jiǎn)直不堪設想,況且您的編程技術(shù)還不至于達到將自己編寫(xiě)的DLL放到系統目錄中的地步吧! 三、調試技巧。 2 、添加DLL的版本信息。開(kāi)場(chǎng)白中提到了版本信息對于DLL是很重要的,如果包含了版本信息,DLL的大小會(huì )增加2Kb。增加這么一點(diǎn)空間是值得的。很不幸我們如果直接使用Project|options菜單中Version選項是不行的,這一點(diǎn)Delphi的幫助文件中沒(méi)有提到,經(jīng)筆者研究發(fā)現,只要加一行代碼就可以了。如下例: library Delphi; uses {$R *.RES} function TestDll(i:integer):integer;stdcall; exports begin 3 、為了避免與別的DLL重名,在給自己編寫(xiě)的DLL起名字的時(shí)候最好采用字符數字和下劃線(xiàn)混合的方式。如:jl_try16.dll。 4 、如果您原來(lái)在Delphi 1或Delphi 2中已經(jīng)編譯了某些DLL的話(huà),您原來(lái)編譯的DLL是16位的。只要將源代碼在新的Delphi 3或Delphi 4環(huán)境下重新編譯,就可以得到32位的DLL了。 [后記](méi):除了上面介紹的DLL最常用的使用方法外,DLL還可以用于做資源的載體。例如,在Windows中更改圖標就是使用的DLL中的資源。另外,熟練掌握了DLL的設計技術(shù),對使用更為高級的OLE、COM以及ActiveX編程都有很多益處。 |
聯(lián)系客服