一、開使你的第一個DLL專案
1.File->Close all->File->New﹝DLL﹞
代碼:
//自動產生Code如下
library Project2;
//這有段廢話
uses
SysUtils,
Classes;
{$R *.RES}
begin
end.
2.加個Func進來:
代碼:
library Project2;
//切記:Library 的名字大小寫沒關系,可是DLL-Func的大小寫就有關系了。在 DLL-Func-Name寫成MyMax與myMAX是不同的。如果寫錯了,立即 的結果是你叫用到此DLL的AP根本開不起來參數的大小寫就沒關系了。甚至不必同名。如原型中是 (X,Y:integer)但引用時寫成(A,B:integer),那是沒關系的。切記:要再加個stdcall。書上講,如果你是用Delphi寫DLL,且希望不僅給Delphi-AP也希望BCB/VC-AP等使用的話,那你最好加個Stdcall ; 的指示參數型態:Delphi有很多種它自己的變量型態,這些當然不是DLL所喜歡的,Windows/DLL的母語應該是C。所以如果要傳進傳出DLL的參數,我們盡可能照規矩來用。這兩者寫起來,後者會麻煩不少。如果你對C不熟的話,那也沒關系。我們以後再講。
uses
SysUtils,
Classes;
Function MyMax ( X , Y : integer ) : integer ; stdcall ;
begin
if X > Y then
Result := X
else
Result := Y ;
end ;
{$R *.RES}
begin
end.
3.將這些可共享的Func送出DLL,讓外界﹝就是你的Delphi-AP啦﹞使用:光如此,你的AP還不能用到這些,你還要加個Exports才行。
代碼:
{$R *.RES}
exports
MyMax ;
begin
end.
4.好了,可以按 Ctrl-F9編譯了。此時可不要按F9。DLL不是EXE┌不可單獨執行的,如果你按F9,會有ErrorMsg的。這時如果DLL有Error,請修正之。再按Ctrl-F9。此時可能有Warning,不要緊,研究一下,看看就好。再按Ctrl-F9,此時就『Done , Compiled 』。同目錄就會有個 *.dll 。恭喜,大功告成了。
二、進行測試:開個新application:
1.加個TButton
代碼:
ShowMessage ( IntToStr(MyMax(30,50)) ) ;
2.告知Exe到那裡抓個Func
代碼:
//在Form,interface,var後加
Function MyMax ( X , Y : integer ) : integer ; stdcall ; external 'MyTestDLL.dll' ;
// MyTestDLL.dll為你前時寫的DLL項目名字
// DLL名字大小寫沒關系。不過記得要加 extension的 .DLL。在Win95或NT,
// 是不必加 extension,但這兩種OS,可能越來越少了吧。要加extension
可以了,簡單吧。
上面的例子是不是很簡單?熟悉Delphi的朋友可以看出以上代碼和一般的Delphi程序的編寫基本是相同的,只是在TestDll函數後多了一個stdcall參數並且用exports語句聲明了TestDll函數。只要編譯上面的代碼,就可以玫揭桓雒狣elphi.dll的動態鏈接庫。現在,讓我們來看看有哪些需要注意的地方:
1.在DLL中編寫的函數或過程都必須加上stdcall調用參數。在Delphi 1或Delphi 2環境下該調用參數是far。從Delphi 3以後將這個參數變為了stdcall,目的是為了使用標准的Win32參數傳遞技術來代替優化的reGISter參數。忘記使用stdcall參數是常見的錯誤,這個錯誤不會影響DLL的編譯和生成,但當調用這個DLL時會發生很嚴重的錯誤,導致操作系統的死鎖。原因是register參數是Delphi的默認參數。
2.所寫的函數和過程應該用exports語句聲明為外部函數。
正如大家看到的,TestDll函數被聲明為一個外部函數。這樣做可以使該函數在外部就能看到,具體方法是單激鼠標右鍵用“快速查看(Quick VIEw)”功能查看該DLL文件。(如果沒有“快速查看”選項可以從Windows CD上安裝。)TestDll函數會出現在Export Table欄中。另一個很充分的理由是,如果不這樣聲明,我們編寫的函數將不能被調用,這是大家都不願看到的。
3.當使用了長字符串類型的參數、變量時要引用ShareMem。
Delphi中的string類型很強大,我們知道普通的字符串長度最大為256個字符,但Delphi中string類型在默認情況下長度可以達到2G。(對,您沒有看錯,確實是兩兆。)這時,如果您堅持要使用string類型的參數、變量甚至是記錄信息時,就要引用ShareMem單元,而且必須是第一個引用的。既在uses語句後是第一個引用的單元。如下例:
uses
ShareMem,
SysUtils,
Classes;
還有一點,在您的工程文件(*.dpr)中而不是單元文件(*.pas)中也要做同樣的工作,這一點Delphi自帶的幫助文件沒有說清楚,造成了很多誤會。不這樣做的話,您很有可能付出死機的代價。避免使用string類型的方法是將string類型的參數、變量等聲明為Pchar或ShortString(如:s:string[10])類型。同樣的問題會出現在當您使用了動態數組時,解決的方法同上所述。