散分了,里面还有高手吗,有用过动态掉用bpl包中的frame没有,怎么调用法(200分)

  • 主题发起人 主题发起人 fly520
  • 开始时间 开始时间
F

fly520

Unregistered / Unconfirmed
GUEST, unregistred user!
我要动态调用一个bpl包,这个bpl包要里面的函数要能操作我主程序的主窗体界面,将菜单栏添加菜单等,我静态调用没有问题,动态就出地址错误,我想问这种方式可以吗,有做过的没有。原码我贴上:<br>procedure initmain(ParentApplication: TApplication; MainMenu: TMainMenu; TreeView: TTreeView); stdcall;<br>var<br>&nbsp; Nzhuoyue, Nshuidian :TmenuItem;<br>&nbsp; rzhuoyue, rshuidian : TTreeNode;<br>begin<br>&nbsp;// Application:=ParentApplication;<br>&nbsp; Nzhuoyue:= TmenuItem.Create(nil);<br>&nbsp; Nzhuoyue.Caption := 'aaaaaaaaa;<br>&nbsp; Nshuidian:= TmenuItem.Create(nil);<br>&nbsp; Nshuidian.Caption := '水电查询';<br>&nbsp; Nzhuoyue.Add(Nshuidian);<br>&nbsp; MainMenu.Items.Insert(4,Nzhuoyue);<br>end;<br>这个是我在bpl包里面定义的一个方法使主窗体界面的菜单添加两项。<br>我有把bpl的窗体注册和反注册:<br>nitialization<br>&nbsp; RegisterClass(Tfrmzhouyue);<br><br>finalization<br>&nbsp; UnRegisterClass(Tfrmzhouyue);<br><br>主程序中调用:<br>&nbsp; &nbsp; try<br>&nbsp; &nbsp; &nbsp; pluginname := 'aa.bpl';<br>&nbsp; &nbsp; &nbsp; h := LoadPackage(pluginname);<br>&nbsp; &nbsp; &nbsp; Plugininitmain:=getprocaddress(h,'initmain');<br>&nbsp; &nbsp; &nbsp; if (@Plugininitmain &lt;&gt; nil) then<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Plugininitmain(Application, MainMenu,frameTree1.tvLeftMenu);<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp;finally<br>&nbsp; &nbsp; &nbsp; &nbsp; UnLoadPackage(h);<br>&nbsp; &nbsp; &nbsp;end;<br><br>在调用bpl包的时候如果我在bpl包里的函数中加入<br>Application:=ParentApplication;<br>则会自动关闭我的程序,不加则报地址错误,添加菜单出错。<br><br>我在主程序中的包中的option中引用这个bpl包则不会出错,但这是静态调用吧,我想不要引用,直接动态调用。
 
1、我不是高手,但我到你的帖子里看看,没人能赶我出去...<br>2、我不是高手,所以我离开了,再见...
 
顶一个,赚分。
 
两个想法<br>一是你的构造菜单的程序在应用程序中是否可用。<br>二是如果这样调用不行,可以偿试使用定义一接口,然后使用回调来调用BPL
 
一应用程序中可以用的,没有问题。<br>二 不知道接口怎么定义法,给个详细的例子吗,别搞太复杂了.
 
qq:18077968 我给你例子
 
我帮你顶~
 
将你的程序Build with runtime package。但是在package列表中删除你自己写的那个package。这样做的话 你的主程序和VCL runtime package还有你自己的package 都共用同一份全局变量。也不用给Application赋值了。
 
后退
顶部