DLL檔案在Delphi的建立及呼叫 (轉)

worldblog發表於2008-01-08
DLL檔案在Delphi的建立及呼叫 (轉)[@more@]


主題:DLL在的建立及


  現時的開發,多數都在幾人以上的組合,工合作方式開發,這樣也方便系統的開發目的。
而DLL的方法最為方便。我現整理了一些這方面資料,希望能幫助一些有需要的同學(記得我剛學時,請人教是一不可想象的事)。

//(Copy book)

一.過程的寫法:


library FIRSTDLL;


uses
  SysUtils,
  Classes;


{$R *.RES}
// 1.定義函式具體過程和輸出介面方式
// --------------------------------
// 函式 1
// 功能:事資料3倍放大函式
// --------------------------------
function BBnToSSnn(SourceResult:Integer):Integer;stdCall;
begin
  if SourceResult>0 then
  Result:=SourceResult+3 //結果存放於Result
  else
  Result:=SourceResult;
end;


exports 
  BBnToSSnn; //2.函式輸出口定義
 
end.


==
==


二.在DLL中建立Form
=======================
1.一步,建立DLL工程,及加入設定好的Form


library MGRPERSN;
uses
  SysUtils,
  Classes,
  MGRPERFM in 'MGRPERFM.pas' {FormPERSON};//1.Form的程式碼(與一般的Form一樣)


{$R *.RES}
exports
  ShowPerSN;//2.函式輸出口定義
begin
end.


2. 在DLL設定的Form的設定
===========================================
unit MGRPERFM;


interface


uses
  , Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, ToolWin, ImgList;


type
  TFormPERSON = class(TForm)
  private
  { Private declarations }
  public
  { Public declarations }
  end;


//些處的變數不再用,給其改個地方,如下(改變之一)
//var
//  FormPERSON: TFormPERSON;

{宣佈Form函式出口}//改變之二
function ShowPerSN(AHandle: THandle; ACaption: String):BOOL; StdCall;


implementation


{$R *.DFM}
//函式據過程定義
function ShowPerSN(AHandle: THandle; ACaption: String):BOOL;
var
  FormPERSON: TFormPERSON; //定義窗體類(上面的放到了此處)
begin
  //複製應用程式控制程式碼給DLL的應有程式
  Application.Handle := AHandle;
  FormPERSON := TFormPERSON.Create(Application);//建立TForm
  try
  FormPERSON.Caption := ACaption;
  FormPERSON.ShowModal;//顯示此Form
  Result := False; //反回成功值
  finally
  FormPERSON.Free;
  end;
end;


三.DLL中函式及窗體的呼叫
==========================
1.呼叫方法一
--------------
implementation //在此的下方寫明呼叫函式的DLL


{$R *.DFM}
//DLL內函式呼叫
function BBnToSSnn(SourceResult:Integer):Integer;
  StdCall external 'FIRSTDLL.DLL';


........


2.呼叫方法二
==============
type  //在此建立一個函式類
  // 1 -------------------------------
  TShowPerSN = function (AHandle: THandle; ACaption: String): BOOL; StdCall;
  EDLLLoadError = class(Exception);//同時分建立一個出錯記錄類
  // 1 -------------------------------
  TMAINCLTR = class(TForm) //這裡不變,系統自動生成


......


procedure TMAINCLTR.ToolButton1Click(Sender: T);
var  //按鈕的呼叫事件:呼叫過程
  LibHandle: THandle;
  ShowPerSN: TShowPerSN;
begin
  Application.Title:='人力資源管理系統DLL檔案測試程式';
  { Attempt to load the DLL 嘗試裝入DLL檔案}
  LibHandle := LoadLibrary('MGRPERSN.DLL');
  try
  if LibHandle = 0 then
  raise EDLLLoadError.Create('無法成功裝入MGRPERSN.DLL');
  @ShowPerSN := GetProcAddress(LibHandle, 'ShowPerSN');
  if not (@ShowPerSN = nil) then
  ShowPerSN(Application.Handle, '人事資料管理')//呼叫出窗體
  else
  RaiseLastError;
  finally
  FreeLibrary(LibHandle); // Unload the DLL.
  end;
end;
============== END ==================


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996881/,如需轉載,請註明出處,否則將追究法律責任。

相關文章