版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、手把手教delphi:寫你的dll文件(1)【 時間:2007-11-7 | 人氣:95 | 收藏本文 】 【 字體:大 中 小 】一、開使你的第一個DLL專案 1.File->Close all->File->NewDLL 代碼:/自動產(chǎn)生Code如下 library Project2; /這有段廢話 uses SysUtils, Classes; $R *.RES begin end. 2.加個Func進來: 代碼:library Project2; uses SysUtils, Classes; Function MyMax ( X , Y : integer ) :
2、integer ; stdcall ; begin if X > Y then Result := X else Result := Y ; end ; /切記:Library 的名字大小寫沒關(guān)系,可是DLL-Func的大小寫就有關(guān)系了。 / 在 DLL-Func-Name寫成MyMax與myMAX是不同的。如果寫錯了,立即 / 的結(jié)果是你叫用到此DLL的AP根本開不起來。 /參數(shù)的大小寫就沒關(guān)系了。甚至不必同名。如原型中是 (X,Y:integer)但引 / 用時寫成(A,B:integer),那是沒關(guān)系的。 /切記:要再加個stdcall。書上講,如果你是用Delphi寫DLL,且希
3、望不僅給 / Delphi-AP也希望BCB/VC-AP等使用的話,那你最好加個Stdcall ; 的指示 /參數(shù)型態(tài):Delphi有很多種它自己的變量型態(tài),這些當然不是DLL所喜歡的 / ,Windows/DLL的母語應(yīng)該是C。所以如果要傳進傳出DLL的參數(shù),我們 / 盡可能照規(guī)矩來用。這兩者寫起來,后者會麻煩不少。如果你對C不熟 / 的話,那也沒關(guān)系。我們以后再講。 $R *.RES begin end. 3.將這些可共享的Func送出DLL,讓外界就是你的Delphi-AP啦使用:光如此,你的AP還不能用到這些,你還要加個Exports才行。 代碼: $R *.RES exports M
4、yMax ; begin end. 4.好了,可以按 Ctrl-F9編譯了。此時可不要按F9。DLL不是EXE不可單獨執(zhí)行的,如果你按F9,會有ErrorMsg的。這時如果DLL有Error,請修正之。再按Ctrl-F9。此時可能有Warning,不要緊,研究一下,看看就好。再按Ctrl-F9,此時就Done , Compiled 。同目錄就會有個 *.dll 。恭喜,大功告成了。 二、進行測試:開個新application: 1.加個TButton 代碼:ShowMessage ( IntToStr(MyMax(30,50) ) ; 2.告知Exe到那里抓個Func 代碼:/在Form,in
5、terface,var后加 Function MyMax ( X , Y : integer ) : integer ; stdcall ; external 'MyTestDLL.dll' ; / MyTestDLL.dll為你前時寫的DLL項目名字 / DLL名字大小寫沒關(guān)系。不過記得要加 extension的 .DLL。在Win95或NT, / 是不必加 extension,但這兩種OS,可能越來越少了吧。要加extension 可以了,簡單吧。上面的例子是不是很簡單?熟悉Delphi的朋友可以看出以上代碼和一般的Delphi程序的編寫基本是相同的,只是在TestDll函
6、數(shù)后多了一個stdcall參數(shù)并且用exports語句聲明了TestDll函數(shù)。只要編譯上面的代碼,就可以玫揭桓雒?a href='/html/xueyuan/chengxukaifa/Delphijiaocheng'>Delphi.dll的動態(tài)鏈接庫。現(xiàn)在,讓我們來看看有哪些需要注意的地方:1.在DLL中編寫的函數(shù)或過程都必須加上stdcall調(diào)用參數(shù)。在Delphi 1或Delphi 2環(huán)境下該調(diào)用參數(shù)是far。從Delphi 3以后將這個參數(shù)變?yōu)榱藄tdcall,目的是為了使用標準的Win32參數(shù)傳遞技術(shù)來代替優(yōu)化的register參數(shù)。忘記使用stdcall參數(shù)是
7、常見的錯誤,這個錯誤不會影響DLL的編譯和生成,但當調(diào)用這個DLL時會發(fā)生很嚴重的錯誤,導(dǎo)致操作系統(tǒng)的死鎖。原因是register參數(shù)是Delphi的默認參數(shù)。 2.所寫的函數(shù)和過程應(yīng)該用exports語句聲明為外部函數(shù)。 正如大家看到的,TestDll函數(shù)被聲明為一個外部函數(shù)。這樣做可以使該函數(shù)在外部就能看到,具體方法是單激鼠標右鍵用“快速查看(Quick View)”功能查看該DLL文件。(如果沒有“快速查看”選項可以從Windows CD上安裝。)TestDll函數(shù)會出現(xiàn)在Export Table欄中。另一個很充分的理由是,如果不這樣聲明,我們編寫的函數(shù)將不能被調(diào)用,這是大家都不愿看到的
8、。 3.當使用了長字符串類型的參數(shù)、變量時要引用ShareMem。 Delphi中的string類型很強大,我們知道普通的字符串長度最大為256個字符,但Delphi中string類型在默認情況下長度可以達到2G。(對,您沒有看錯,確實是兩兆。)這時,如果您堅持要使用string類型的參數(shù)、變量甚至是記錄信息時,就要引用ShareMem單元,而且必須是第一個引用的。既在uses語句后是第一個引用的單元。如下例: uses ShareMem, SysUtils, Classes; 還有一點,在您的工程文件(*.dpr)中而不是單元文件(*.pas)中也要做同樣的工作,這一點Delphi自帶的幫助
9、文件沒有說清楚,造成了很多誤會。不這樣做的話,您很有可能付出死機的代價。避免使用string類型的方法是將string類型的參數(shù)、變量等聲明為Pchar或ShortString(如:s:string10)類型。同樣的問題會出現(xiàn)在當您使用了動態(tài)數(shù)組時,解決的方法同上所述。 手把手教delphi:寫你的dll文件(2)【 時間:2007-11-7 | 人氣:88 | 收藏本文 】 【 字體:大 中 小 】在Delphi中靜態(tài)調(diào)用DLL top 調(diào)用一個DLL比寫一個DLL要容易一些。首先給大家介紹的是靜態(tài)調(diào)用方法,稍后將介紹動態(tài)調(diào)用方法,并就兩種方法做一個比較。同樣的,我們先舉一個靜態(tài)調(diào)用的例子。
10、 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private Private declarations public Public declarations end; var Form1: TForm1; implemen
11、tation $R *.DFM /本行以下代碼為我們真正動手寫的代碼 function TestDll(i:integer):integer;stdcall; external Delphi.dll; procedure TForm1.Button1Click(Sender: TObject); begin Edit1.Text:=IntToStr(TestDll(1); end; end. 上面的例子中我們在窗體上放置了一個編輯框(Edit)和一個按鈕(Button),并且書寫了很少的代碼來測試我們剛剛編寫的Delphi.dll。大家可以看到我們唯一做的工作是將TestDll函數(shù)的說明部分放
12、在了implementation中,并且用external語句指定了Delphi.dll的位置。(本例中調(diào)用程序和Delphi.dll在同一個目錄中。)讓人興奮的是,我們自己編寫的TestDll函數(shù)很快被Delphi認出來了。您可做這樣一個實驗:輸入“TestDll(”,很快Delphi就會用fly-by提示條提示您應(yīng)該輸入的參數(shù)是什么,就像我們使用Delphi中定義的其他函數(shù)一樣簡單。注意事項有以下一些: 一、調(diào)用參數(shù)用stdcall 和前面提到的一樣,當引用DLL中的函數(shù)和過程時也要使用stdcall參數(shù),原因和前面提到的一樣。 二、用external語句指定被調(diào)用的DLL文件的路徑和名稱
13、 正如大家看到的,我們在external語句中指定了所要調(diào)用的DLL文件的名稱。沒有寫路徑是因為該DLL文件和調(diào)用它的主程序在同一目錄下。如果該DLL文件在C:,則我們可將上面的引用語句寫為external C:Delphi.dll。注意文件的后綴.dll必須寫上。 三、不能從DLL中調(diào)用全局變量 如果我們在DLL中聲明了某種全局變量,如:var s:byte 。這樣在DLL中s這個全局變量是可以正常使用的,但s不能被調(diào)用程序使用,既s不能作為全局變量傳遞給調(diào)用程序。不過在調(diào)用程序中聲明的變量可以作為參數(shù)傳遞給DLL。 四、被調(diào)用的DLL必須存在 這一點很重要,使用靜態(tài)調(diào)用方法時要求所調(diào)用的D
14、LL文件以及要調(diào)用的函數(shù)或過程等等必須存在。如果不存在或指定的路徑和文件名不正確的話,運行主程序時系統(tǒng)會提示“啟動程序時出錯”或“找不到*.dll文件”等運行錯誤。 在Delphi中動態(tài)調(diào)用DLL top 動態(tài)調(diào)用DLL相對復(fù)雜很多,但非常靈活。為了全面的說明該問題,這次我們舉一個調(diào)用由C+編寫的DLL的例子。首先在C+中編譯下面的DLL源程序。 #include extern ”C” _declspec(dllexport) int WINAPI TestC(int i) return i; 編譯后生成一個DLL文件,在這里我們稱該文件為Cpp.dll,該DLL中只有一個返回整數(shù)類型的函數(shù)T
15、estC。為了方便說明,我們?nèi)匀灰蒙厦娴恼{(diào)用程序,只是將原來的Button1Click過程中的語句用下面的代碼替換掉了。 procedure TForm1.Button1Click(Sender: TObject); type TIntFunc=function(i:integer):integer;stdcall; var Th:Thandle; Tf:TIntFunc; Tp:TFarProc; begin Th:=LoadLibrary(Cpp.dll); 裝載DLL if Th>0 then try Tp:=GetProcAddress(Th,PChar(TestC); if
16、Tp<>nil then begin Tf:=TIntFunc(Tp); Edit1.Text:=IntToStr(Tf(1); 調(diào)用TestC函數(shù) end else ShowMessage(TestC函數(shù)沒有找到); finally FreeLibrary(Th); 釋放DLL end else ShowMessage(Cpp.dll沒有找到); end; 大家已經(jīng)看到了,這種動態(tài)調(diào)用技術(shù)很復(fù)雜,但只要修改參數(shù),如修改LoadLibrary(Cpp.dll)中的DLL名稱為Delphi.dll就可動態(tài)更改所調(diào)用的DLL。 一、定義所要調(diào)用的函數(shù)或過程的類型 在上面的代碼中我們定義
17、了一個TIntFunc類型,這是對應(yīng)我們將要調(diào)用的函數(shù)TestC的。在其他調(diào)用情況下也要做同樣的定義工作。并且也要加上stdcall調(diào)用參數(shù)。 二、釋放所調(diào)用的DLL 我們用LoadLibrary動態(tài)的調(diào)用了一個DLL,但要記住必須在使用完后手動地用FreeLibrary將該DLL釋放掉,否則該DLL將一直占用內(nèi)存直到您退出Windows或關(guān)機為止。 現(xiàn)在我們來評價一下兩種調(diào)用DLL的方法的優(yōu)缺點。靜態(tài)方法實現(xiàn)簡單,易于掌握并且一般來說稍微快一點,也更加安全可靠一些;但是靜態(tài)方法不能靈活地在運行時裝卸所需的DLL,而是在主程序開始運行時就裝載指定的DLL直到程序結(jié)束時才釋放該DLL,另外只有基
18、于編譯器和鏈接器的系統(tǒng)(如Delphi)才可以使用該方法。動態(tài)方法較好地解決了靜態(tài)方法中存在的不足,可以方便地訪問DLL中的函數(shù)和過程,甚至一些老版本DLL中新添加的函數(shù)或過程;但動態(tài)方法難以完全掌握,使用時因為不同的函數(shù)或過程要定義很多很復(fù)雜的類型和調(diào)用方法。對于初學(xué)者,筆者建議您使用靜態(tài)方法,待熟練后再使用動態(tài)調(diào)用方法。 使用DLL的實用技巧 top 一、編寫技巧 1 、為了保證DLL的正確性,可先編寫成普通的應(yīng)用程序的一部分,調(diào)試無誤后再從主程序中分離出來,編譯成DLL。 2 、為了保證DLL的通用性,應(yīng)該在自己編寫的DLL中杜絕出現(xiàn)可視化控件的名稱,如:Edit1.Text中的Edit
19、1名稱;或者自定義非Windows定義的類型,如某種記錄。 3 、為便于調(diào)試,每個函數(shù)和過程應(yīng)該盡可能短小精悍,并配合具體詳細的注釋。 4 、應(yīng)多利用try-finally來處理可能出現(xiàn)的錯誤和異常,注意這時要引用SysUtils單元。 5 、盡可能少引用單元以減小DLL的大小,特別是不要引用可視化單元,如Dialogs單元。例如一般情況下,我們可以不引用Classes單元,這樣可使編譯后的DLL減小大約16Kb。 二、調(diào)用技巧 1 、在用靜態(tài)方法時,可以給被調(diào)用的函數(shù)或過程更名。在前面提到的C+編寫的DLL例子中,如果去掉extern ”C”語句,C+會編譯出一些奇怪的函數(shù)名,原來的Test
20、C函數(shù)會被命名為TestC$s等等可笑的怪名字,這是由于C+采用了C+ name mangling技術(shù)。這個函數(shù)名在Delphi中是非法的,我們可以這樣解決這個問題: 改寫引用函數(shù)為 function TestC(i:integer):integer;stdcall; external Cpp.dll;name TestC$s; 其中name的作用就是重命名。 2 、可把我們編寫的DLL放到Windows目錄下或者Windowssystem目錄下。這樣做可以在external語句中或LoadLibrary語句中不寫路徑而只寫DLL的名稱。但這樣做有些不妥,這兩個目錄下有大量重要的系統(tǒng)DLL,如果您編的DLL與它們重名的話其后果簡直不堪設(shè)想,況且您的編程技術(shù)還不至于達到將自己編寫的DLL放到系統(tǒng)目錄中的地步吧! 三、調(diào)試技巧1 、我們知道DLL在編寫時是不能運行和單步調(diào)試的。有一個辦法可以,那就是在Run|paramete
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專業(yè)保潔服務(wù)定制協(xié)議范本(2024版)版B版
- 2024年規(guī)范版回遷房屋交易協(xié)議版
- 2024年短期融資過橋擔保合同版B版
- 萬達商業(yè)廣場2024年物業(yè)運營管理合同版
- 2025年度大棚建筑智能監(jiān)控系統(tǒng)開發(fā)與應(yīng)用合同3篇
- 專業(yè)定制股東合作框架合同(2024年版)一
- 長春醫(yī)學(xué)高等??茖W(xué)校《資本運營與公司治理》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年甲方與乙方設(shè)備租賃合同
- 服裝行業(yè)顧問工作總結(jié)
- 2024最簡單的汽油購銷合同范本
- 廣州社會保險退款申請表
- 2024年知識競賽-競彩知識筆試參考題庫含答案
- 高效協(xié)同-培訓(xùn)課件
- 20XX年市場洞察模板
- 2023-2024學(xué)年《Web開發(fā)基礎(chǔ)》試卷及答案解析
- 標準化考場方案
- 遙感技術(shù)在地表水源地水體監(jiān)測中的應(yīng)用研究
- 鐵路職業(yè)病防治工作課件
- 核電經(jīng)驗反饋培訓(xùn)課件
- 環(huán)境影響評價技術(shù)方案
- 部隊預(yù)防醉駕
評論
0/150
提交評論