手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

初探Delphi中的插件编程

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  ·模块别称是用来在编程设计阶段统一命名的规则,特别是团队开发时可以供队员参考。

  ·模块名称将作为ACAPTION参数传递给SHOWDLLFORM函数作为DLL窗口的标题。

  ·窗体唯一标识是DLL子模块中主窗口的CLASSNAME,用来在运行时确定要控制的窗口。

  ·DLL路径保存DLL文件名称,程序中将转换为绝对路径。

  2) 插件信息数据结构

  定义一个记录插件相关信息的数据接口可以集中控制DLL插件。在Interface部分加入如下代码:

type

 //定义插件信息类

 TMyPlugins = class
 Caption:String; //DLL窗体标题
 DllFileName:String; //DLL文件路径
 WndClass:String; //窗体标识
 UserID:string; //用户名
 ProcAddr:THandle; //LOADLIBRARY载入的库句柄
 FuncAddr:Pointer; //SHOWDLLFORM函数指针
 FuncFreeAddr:Pointer; //FREEDLLFORM函数指针
end;

……
  为每个插件创建一个TMyPlugins的实例,下文会讨论对这些实例的初始化方法。

  3) 插件载入函数

  在本示例中DLL窗口是在HALL中触发打开子窗口的事件中载入并显示的。按钮事件触发后,先根据插件结构体实例判断DLL是否已经加载,如果已经加载,则控制窗口的显示或关闭;如果没有加载则访问数据表将字段赋值到插件结构体中,然后执行载入、获得指针的工作。

  局部代码如下

……
//-----------------------------------------

//Name: OpenPlugin

//Func: 插件信息类控制过程: 初始化==》设置权限==》载入DLL窗口

//Para: APlugin-TMyPlugins; sAlias别名; iFuncValue权限值

//Rtrn: N/A

//Auth: CST

//Date: 2005-6-2

//-----------------------------------------

procedure TFormHall.OpenPlugin(AFromActn: TAction ;APlugin:TMyPlugins; sAlias:string; sUserID:string);
 var hWndPlugin:HWnd;
begin
 
 //判断插件窗口是否已经载入 hWndPlugin:=FindWindow(PChar(APlugin.WndClass),nil);
 if hWndPlugin <> 0 then //插件窗口已经载入
 begin
  if not IsWindowVisible(hWndPlugin) then
  begin
   AFromActn.Checked := True;
   ShowWindow(hWndPlugin,SW_SHOWDEFAULT); //显示
  end
  else
  begin
   AFromActn.checked := False;
   ShowWindow(hWndPlugin,SW_HIDE) ;
  end;
  Exit; //离开创建插件过程
 end;

//初始化插件类实例

if not InitializeMyPlugins(APlugin,sAlias) then
begin
 showmessage(’初始化插件类错误。’);
 exit;
end;

//获得当前权限值

APlugin.UserID := sUserID;
//载入DLL窗口

if not LoadShowPluginForm(APlugin) then
begin
 showmessage(’载入中心插件出错。’);
 exit;
 end;
end;

//-----------------------------------------
//Name: InitializeMyPlugins
//Func: 初始化MYPLUGIN实例 (Caption | DllFileName | IsLoaded)
//Para: APlugin-TMyPlugins
//Rtrn: N/A
//Auth: CST
//Date: 2005-6-2
//-----------------------------------------

function TFormHall.InitializeMyPlugins(APlugin:TMyPlugins; sAlias:String):Boolean;
var
 strSQL:string;
 myDA:TMyDataAdapter;
begin
 Result:=False;
 myDA:=TMyDataAdapter.Create;
 strSQL:=’SELECT * FROM SystemModuleList WHERE modAlias=’ QuotedStr(sAlias);
 try
  myDA.RetrieveData(strSQL);
 except
  on E:Exception do
  begin
   result:=false;
   myDA.Free ;
   exit;
  end;
 end;
try
 begin
  with myDA.MyDataSet do
 begin
  if Not IsEmpty then
 begin
  APlugin.Caption:= FieldByName(’modName’).Value;
  APlugin.DllFileName := FieldByName(’modFile’).Value;
  APlugin.WndClass := FieldByName(’modWndClass’).Value ;
  result:=True;
 end;
Close;
 end; //end of with...do...
 end; //end of try
 except
  on E:Exception do
begin
 Result:=False;
 myDA.Free ;
 Exit;
 end; //end of exception
end; //end of try...except

 myDA.Free ;
end;



//-----------------------------------------

//Name: LoadShowPluginForm

//Func: 载入DLL插件并显示窗口

//Para: APlugin-TMyPlugins

//Rtrn: true-创建成功

//Auth: CST

//Date: 2005-6-2

//-----------------------------------------

function TFormHall.LoadShowPluginForm (const APlugin:TMyPlugins):boolean;

var
 ShowDLLForm: TShowDLLForm; //DLL接口函数实例
 FreeDLLForm: TFreeDLLForm;
 sPath:string; //DLL文件的完整路径
begin
 try
 begin
  sPath:=ExtractFilepath(Application.ExeName) ’plugins\’ APlugin.DllFileName ;
  APlugin.ProcAddr := LoadLibrary(PChar(sPath));
  APlugin.FuncFreeAddr := GetProcAddress(APlugin.ProcAddr,’FreeDLLForm’);
  APlugin.FuncAddr := GetProcAddress(APlugin.ProcAddr ,’ShowDLLForm’);
  @ShowDLLForm:=APlugin.FuncAddr ;
  @FreeDLLForm:=APlugin.FuncFreeAddr;

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!