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

初探Delphi中的插件編程(2)

編輯:Delphi

2、接口設計

實例程序Narcissus中我們預留兩個接口函數:

ShowDLLForm

該函數將應用程序的句柄傳遞給DLL子窗口,DLL程序將動態創建DLL窗體的實例。還可以將一些業務邏輯用參數的形式傳遞給DLL子窗口,比如窗體名稱、當前登陸的用戶名等。初次調用一個DLL窗體實例時使用此函數創建。

FreeDLLForm

該函數將顯示釋放DLL窗口實例,在退出應用程序時調用每個DLL窗體的FreeDLLForm方法來釋放創建的實例,不然會引起內存只讀錯誤。同樣,也可以將一些在釋放窗體時需要做的業務邏輯用參數的形式傳遞給DLL窗體。

3、調試方式

DLL窗體程序無法直接執行,需要有一個插件容器來調用。應此我們需要先實現一個基本的Hall程序,然後將Hall.exe保存在一個固定的目錄中。對每個DLL工程做如下設置:

1) 打開DLL工程

2) 選擇菜單 Run – Parameters

3) 在彈出的窗口中浏覽到我們的容器Hall.exe

這樣在調試DLL程序時將會自動調用Hall程序,利用Hall中預留的調用接口調試DLL程序。

插件程序的基本實現

DLL程序的設計方式和普通WINAPP沒有很大的區別,只是所有的窗口都是作為一種特殊的“資源”保存在DLL庫中,需要手動調用,而不像WINAPP中會有工程自動創建。聲明接口函數的方法很簡單

1) 在Unit的Implementation部分中聲明函數

2) 在函數聲明語句的尾部加上stdcall標記

3) 在工程代碼(Project – VIEw Source)的begin語句之前,用exports語句聲明函數接口

為了使代碼簡潔,我個人喜歡在工程中獨立添加一個Unit單元(File – New -- Unit),然後將所有要輸出的函數體定義在此單元中,不要忘記將引用到的窗體的Unit也uses進來。我命名這個單元為UnitEntrance,在ShowDLLForm函數中初始化了要顯示的窗口並調用Show方法顯示,HALL會將登陸的用戶名用參數傳遞過來,得到用戶名後就可以進行一些權限控制,表現在界面初始化上。

其代碼如下

unit UnitOfficeEntrance;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms;
 function ShowDLLForm(AHandle: THandle; ACaption: string; AUserID: string):boolean;stdcall;
 function FreeDLLForm(AHandle: THandle; ACaption: string; AUserID: string):boolean;stdcall;
implementation
 uses UnitOfficialMainForm; // 改成MAINFORM的unit
var
 DLL_Form:TFormOfficialMain; //改成MAINFORM的NAME
 //-----------------------------------------
 //Name: ShowDLLForm
 //Func: DLL插件調用入口函數
 //Para: AHandle 掛靠程序句柄; ACaption 本窗體標題
 //Rtrn: N/A
 //Auth: CST
 //Date: 2005-6-3
 //-----------------------------------------
 function ShowDLLForm(AHandle: THandle; ACaption: string; AUserID: string):boolean;
 begin
  result:=true;
 try
  Application.Handle:=AHandle; //掛靠到主程序容器
  DLL_Form:=TFormOfficialMain.Create(Application); //改成MAINFORM的NAME
 try
  with DLL_Form do
  begin
   Caption := ACaption;
   StatusBar.Panels.Items[0].Text := AUserID;
   //Configure UI
   Show ;
  end;
 except
  on e:exception do
  begin
   dll_form.Free;
  end;
 end;
 except
  result:=false;
  end;
 end;
//-----------------------------------------
//Name: FreeDLLForm
//Func: DLL插件調用出口函數
//Para: AHandle 掛靠程序句柄
//Rtrn: true/false
//Auth: CST
//Date: 2005-6-11
//-----------------------------------------
function FreeDLLForm(AHandle: THandle; ACaption: string; AUserID: string):boolean;
begin
 Application.Handle:=AHandle; //掛靠到主程序容器
 if DLL_Form.Showing then DLL_Form.Close; //如果窗口打開先關閉,觸發FORM.CLOSEQUERY可取消關閉過程
 if not DLL_Form.Showing then
 begin
  DLL_Form.Free;
  result:=true;
 end //仍然打開狀態,說明CLOSEQUERY.CANCLOSE=FALSE
 else
 begin
  result:=false;
 end;
end;
end.

DLL工程文件代碼如下:

library Official;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library’s USES clause AND your project’s (select
Project-VIEw Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applIEs to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
UnitOfficialDetailForm in ’UnitOfficialDetailForm.pas’ {FormOfficialDetail},
UnitOfficialMainForm in ’UnitOfficialMainForm.pas’ {FormOfficialMain},
UnitOfficeEntrance in ’UnitOfficeEntrance.pas’,
UnitOfficialClass in ’..\..\Public\Library\UnitOfficialClass.pas’,
UnitMyDataAdatper in ’..\..\Public\Library\UnitMyDataAdatper.pas’,
UnitMyHeaders in ’..\..\Public\Library\UnitMyHeaders.pas’;
{$R *.res}
exports ShowDLLForm,FreeDLLForm; //接口函數
begin
end.

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