
本文共 2653 字,大约阅读时间需要 8 分钟。
http://pan.baidu.com/s/1skPUQKH
{*******************************************************}
{ }
{ WisdomPluginFramework }
{ 2014 IceAir }
{ ice.air@126.com QQ: 3216343 }
{ }
{*******************************************************}
WisdomPluginFramework框架实际应用中的点点滴滴
Tyrion
刚接触此框架时,可能是习惯了拖控件的编程方式,都要自己去写接口与实现,感觉很麻烦,因为公司要把所有dll模块整合到一起,并像浏览器标签页一样停靠,自由关闭打开,开始我试了Tangram FrameWork,虽然它都封装好了,demo也很丰富,但我觉得它太复杂,于是选择了WisdomPluginFramework。废话不说了,我介绍下自己的使用过程和实践中应注意的一些问题。
一,使用方法:
1,首先建立一个Host主程序,放入rzPageControl来实现标签页停靠dll中的窗体。作者的demo中是程序一运行就把所有dll注册到框架,因为我这要自由打开关闭,并释放dll中UI资源,所以我是实时注册插件,当标签页关闭时就卸载插件。
将WisdomPluginFramework引入Host工程文件,并在程序INI时,启动框架。
2,接口文件IntfCommon.pas,因为dll与host都要用到,所以把所有dll的接口都集中放到此单元里。谁用谁引用即可,当然单元名自己随意改
。
3,ExportFunc.pas,导出方法单元,此单元不能共用,一个dll插件,一个导出方法单元,此单元中的函数比较重要,是Host与dll交互的接口,包括dll注册时和卸载时触发的一些事件,可以再这里完成,如dll插件中Ui资源的释放,也可以把Host中的一些全局变量带入dll插件中。作者都有注释。
4,在dll插件主窗口中加入框架,并实现接口中的方法,值得注意的是,dll插件以前的导出方法完全不用管,也可以像以前一样用,只是另外增加了框架的实现而已,所以不需要改很多内容。
5,Host主程序调用插件,用PluginConfig.exe工具将dll插件加入到config.xml中,如果无报错,应会正常使用。
首先rzPageControl中增加个tabpage页面,然后把dll插件主窗体创建上去。这样就完成了。
二,注意事项
1,因为我是实时注册插件,所以在关闭页面时要有卸载插件的过程,这样才能去触发dll插件中的资源释放。
在打开插件窗口时注意把接口编码存到Tabpage的Hint里
2,插件框架中,只能在Host主程序出现主菜单,dll插件里的主菜单将无法显示,你可以换成其他的菜单或按钮,如rzgroup。
3,ExportFunc中的DLLInitializePlugin过程里,作者是把Host主程序的application传给插件,在实际使用中,dll插件中的窗口会出现一些莫名奇妙的问题,后来把application.handle传进去就好了。
4,Dll插件中的窗口创建,以前是用application.Createform()方法,发现用此创建的窗口关闭时会直接退出主程序,后来用tform.create().
5,在实际改造中会遇到各种问题,大多是窗口UI问题,不过此框架使用还是很方便的。谢谢空气哥的无私奉献。
6,PluginConfig.exe工具源码中有个检查插件的方法,可以在splash窗口中引入并检查插件是否正常。
procedureTfrmSplash.Timer1Timer(Sender: TObject);
var
lpid,lstr: string;
pluginManager: IPluginManager;
begin
pluginManager :=GServiceManager.GetService(PLUGIN_MANAGER_ID) as IPluginManager;
while Fi < FConfig.GetPluginCount do
begin
lpid := FConfig.PluginIDFromIdx(Fi);
//先检查插件dll文件是否存在
lstr := FConfig.PluginDLL(lpid);
if FileExists(lstr) then
begin
if pluginManager.LoadPluginDirect(lstr)= ERROR_SUCCESS then
begin
RzMemo1.Lines.Add(ExtractFileName(lstr) + '模块加载正常')
end else
begin
RzMemo1.Lines.Add(ExtractFileName(lstr) + '模块加载失败')
end;
end;
inc(Fi);
Sleep(200);
end;
if Fi >= FConfig.GetPluginCount then
begin
RzMemo1.Lines.Add('模块检查完毕,开始登陆...');
Sleep(1000);
// GServiceManager.stopService(PLUGIN_MANAGER_ID);
// GServiceManager.StopService(CONFIG_ID);
Close;
end;
end;
7,关于Dll中窗口内嵌其他控件后tab,回车,方向等键不能用的解决方法如下:
不要用delphi自带的parent := xxx 这个方法,不要用窗口的borderstyle := bsnone
用windows api 如下:
Windows.SetParent(vSetForm.Handle, vpage.ActivePage.Handle);
SetWindowLong(vSetForm.Handle, GWL_STYLE, GetWindowLong(vSetForm.Handle, GWL_STYLE) and (not WS_CAPTION) and (not WS_BORDER) and (not WS_THICKFRAME));
发表评论
最新留言
关于作者
