DLL文件在Delphi的創(chuàng)建及調(diào)用
發(fā)表時(shí)間:2023-08-01 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]現(xiàn)時(shí)系統(tǒng)的開發(fā),多數(shù)都在幾人以上的組合,工合作方式開發(fā),這樣也方便系統(tǒng)的快速開發(fā)目的。而DLL的方法最為方便。我現(xiàn)整理了我的一些這方面資料,希望能幫助一些有需要的同行。一.函數(shù)過程的寫法:libra...
現(xiàn)時(shí)系統(tǒng)的開發(fā),多數(shù)都在幾人以上的組合,工合作方式開發(fā),這樣也方便系統(tǒng)的快速開發(fā)目的。
而DLL的方法最為方便。我現(xiàn)整理了我的一些這方面資料,希望能幫助一些有需要的同行。
一.函數(shù)過程的寫法:
library FIRSTDLL;
uses
SysUtils,
Classes;
{$R *.RES}
// 1.定義函數(shù)具體過程和輸出接口方式
// --------------------------------
// 函數(shù) 1
// 功能:事數(shù)據(jù)3倍放大函數(shù)
// --------------------------------
function PenniesToSoins(SourceResult:Integer):Integer;stdCall;
begin
if SourceResult>0 then
Result:=SourceResult*3 //結(jié)果存放于Result
else
Result:=SourceResult;
end;
exports
PenniesToSoins; //2.函數(shù)輸出口定義
end.
==
==
二.在DLL中創(chuàng)建Form
=======================
1.一步,創(chuàng)建DLL工程,及加入設(shè)置好的Form
library MGRPERSN;
uses
SysUtils,
Classes,
MGRPERFM in 'MGRPERFM.pas' {FormPERSON};//1.Form的代碼(與一般的Form一樣)
{$R *.RES}
exports
ShowPerSN;//2.函數(shù)輸出口定義
begin
end.
2. 在DLL設(shè)定的Form的設(shè)置
===========================================
unit MGRPERFM;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, ToolWin, ImgList;
type
TFormPERSON = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
//些處的變量不再用,給其改個(gè)地方,如下(改變之一)
//var
// FormPERSON: TFormPERSON;
{ Declare the export function 宣布Form函數(shù)出口}//改變之二
function ShowPerSN(AHandle: THandle; ACaption: String):BOOL; StdCall;
implementation
{$R *.DFM}
//函數(shù)據(jù)過程定義
function ShowPerSN(AHandle: THandle; ACaption: String):BOOL;
var
FormPERSON: TFormPERSON; //定義窗體類(上面的放到了此處)
begin
// Copy application handle to DLL's TApplication object
//拷貝應(yīng)用程式句柄給DLL的應(yīng)有程式對(duì)象
Application.Handle := AHandle;
FormPERSON := TFormPERSON.Create(Application);//創(chuàng)建控件TForm
try
FormPERSON.Caption := ACaption;
FormPERSON.ShowModal;//顯示此Form
// Pass the date back in Result
Result := False; //反回成功值
finally
FormPERSON.Free;
end;
end;
三.DLL中函數(shù)及窗體的調(diào)用
==========================
1.調(diào)用方法一
--------------
implementation //在此的下方寫明調(diào)用函數(shù)的DLL
{$R *.DFM}
//DLL內(nèi)函數(shù)調(diào)用
function PenniesToSoins(SourceResult:Integer):Integer;
StdCall external 'FIRSTDLL.DLL';
........
2.調(diào)用方法二
==============
type //在此創(chuàng)建一個(gè)函數(shù)類
// 1 -------------------------------
{ First, define a procedural data type, this should reflect the
procedure that is exported from the DLL. }
{ Create a new exception class to reflect a failed DLL load }
TShowPerSN = function (AHandle: THandle; ACaption: String): BOOL; StdCall;
EDLLLoadError = class(Exception);//同時(shí)分創(chuàng)建一個(gè)出錯(cuò)記錄類
// 1 -------------------------------
TMAINCLTR = class(TForm) //這里不變,系統(tǒng)自動(dòng)生成
......
procedure TMAINCLTR.ToolButton1Click(Sender: TObject);
var //按鈕的調(diào)用事件:調(diào)用過程
LibHandle: THandle;
ShowPerSN: TShowPerSN;
begin
Application.Title:='人力資源管理系統(tǒng)DLL文件測試程式';
{ Attempt to load the DLL 嘗試裝入DLL文件}
LibHandle := LoadLibrary('MGRPERSN.DLL');
try
if LibHandle = 0 then
raise EDLLLoadError.Create('Unable to Load DLL(無法成功裝入MGRPERSN.DLL)');
@ShowPerSN := GetProcAddress(LibHandle, 'ShowPerSN');
if not (@ShowPerSN = nil) then
ShowPerSN(Application.Handle, '人事資料管理')//呼叫出窗體
else
RaiseLastWin32Error;
finally
FreeLibrary(LibHandle); // Unload the DLL.
end;
end;
============== END ==================