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;
小结
本实例程序运行效果如下:
我以上的方法中,因为有不少能力有限没有解决的问题,所以采用了一些看起来不太合理的掩饰方法,希望大家能在做了一点尝试后设计出更好的解决方法,我也希望能学到更多的好方法。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




