现在位置:主页>资源共享> 文章内容

初探Delphi中的插件编程

我要投稿更新日期:2008-07-22 点击:

  对于MIS系统,可以利用已有的DBS条件建立一个系统模块表,记录DLL文件及映射到系统模块中的相关信息

字段名 作用 类型
AutoID 索引 INT
modAlias 模块别称 VARCHAR
modName 模块名称 VARCHAR
modWndClass 窗体唯一标识 VARCHAR
modFile DLL路径 VARCHAR
modMemo 备注 TEXT

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

  ·模块名称将作为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


上一页 1 2 34 下一页
所有评论

评论列表


我也评论来评论! 点击此处参与本文评论

注意:本站采用匿名评论,请各位网友注意自己的言行