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;
if ShowDllForm(Self.Handle, APlugin.Caption , APlugin.UserID) then
Result:=True
else
Result:=False;
end;
except
on E:Exception do
begin
Result:=False;
ShowMessage(’载入插件模块错误,请检查PLUGINS目录里的文件是否完整。’);
end;
end;
end;
……
4) DLL窗口控制
正如3)中的代码说明的那样,DLL窗口的打开和关闭只是在表象层,关闭窗口并没有真正释放DLL窗口,只是调用API函数FindWindow根据窗口标识(就是Form.name)获得窗体句柄,用SHOWWINDOW函数的nCmdShow参数控制窗口显示/隐藏。
其实这是我这个程序实现的不好的一个地方,如果在DLL窗口中使用Self.close方法会引起内存错误,实在能力有限没有办法解决,因此出此下策。所以每个DLL程序主窗口的关闭按钮都必须隐藏掉。 :-P
5) DLL库的释放
在程序退出时,必须根据插件信息实例逐一释放DLL库。释放DLL库的函数如下:
| procedure TFormHall.ClosePlugin(aPLG:TMyPlugins); var FreeDLLForm:TFreeDLLForm; begin if aPLG.ProcAddr = 0 then exit; if aPLG.FuncFreeAddr = nil then exit; @FreeDLLForm:=aPLG.FuncFreeAddr; if not FreeDLLForm(Application.Handle,’’,’’) then showMessage(’err’); end; |
小结
本实例程序运行效果如下:
|
我以上的方法中,因为有不少能力有限没有解决的问题,所以采用了一些看起来不太合理的掩饰方法,希望大家能在做了一点尝试后设计出更好的解决方法,我也希望能学到更多的好方法。
上一篇:DELPHI异常处理机制 下一篇:Delphi 中智能对象的实现






评论列表