您的位置:首页 > 其它

WisdomPluginFramework框架实际应用中的点点滴滴

2016-04-29 11:47 288 查看
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));

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: