对于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 上一篇:DELPHI异常处理机制 下一篇:Delphi 中智能对象的实现
|






评论列表