程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 寫你的dll文件(1)

寫你的dll文件(1)

編輯:Delphi

一、開使你的第一個DLL專案

  1.File->Close all->File->New﹝DLL﹞

  代碼:

  //自動產生Code如下
  library Project2;
  //這有段廢話
  uses
  SysUtils,
  Classes;

  {$R *.RES}

  begin
  end.

  2.加個Func進來:
  代碼:

  library Project2;
  uses
  SysUtils,
  Classes;

Function MyMax ( X , Y : integer ) : integer ; stdcall ;
begin
if X > Y then
Result := X
else
Result := Y ;
end ;
//切記: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不熟
// 的話,那也沒關系。我們以後再講。

  {$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])類型。同樣的問題會出現在當您使用了動態數組時,解決的方法同上所述。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved