关于bpl的问题(100)

  • 主题发起人 主题发起人 liuguilg
  • 开始时间 开始时间
L

liuguilg

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了个bpl,用一个不带窗体的类实现接口函数,主程序该如何调用它?:接口pas:unit Unit_DeFine_interface;interfacetype IMy_interface=interface(IUnknown) ['{9C30C81B-0CCB-4459-B8FF-5306C0309473}'] function fn_add(x1,x2:integer):integer; end ;implementationend.接口的实现单元--------------------------unit UnitInterface;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Unit_DeFine_interface;type TImpInterface=class(TInterfacedPersistent, IMy_interface) private { Private declarations } public { Public declarations } function fn_add(x1,x2:integer):integer; end; implementation{ TImpInterface }function TImpInterface.fn_add(x1, x2: integer): integer;begin result := x1 + x2;end;initialization RegisterClass(TImpInterface);finalization UnRegisterClass(TImpInterface);end.接下来主程序该如何调用它,我这个是没有窗体bpl;我用这个方式来获取bpl里面的类,结果获取不到var BPLClass:TClass;begin BPLClass:=GetClass('TImpInterface'); //结果BPLClass=nil请问该怎么实现?
 
建立一个测试程序,将Unit_DeFine_interface.pas和UnitInterface.pas加入到工程里,假如你编译出来的包文件是Package1.bpl,然后将该包文件放到测试程序的目录里,测试程序动态调用包文件的代码如下:...implementationuses Unit_DeFine_interface, UnitInterface;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var MHandle:THandle; ImpObj:TClass; iRs:Integer;begin MHandle:=LoadPackage('Package1.bpl'); if MHandle<>0 then begin ImpObj:=GetClass('TImpInterface'); if ImpObj=nil then exit; iRs:=TImpInterface(ImpObj).fn_add(1,2); showmessage(inttostr(iRs)); UnLoadPackage(MHandle); end;end;还有一种方法是在测试程序的工程文件的选项-Packages-Runtime Packages,选择Build with runtime packages在里面加入Package1.bpl,然后就可以直接调用procedure TForm1.Button2Click(Sender: TObject);var ImpObj:TClass; iRs:Integer;begin ImpObj:=GetClass('TImpInterface'); if ImpObj=nil then exit; iRs:=TImpInterface(ImpObj).fn_add(1,2); showmessage(inttostr(iRs));end;
 
还是不行,总是 ImpObj=nil
 
都用到接口了,应该这样做。先说一下,我没有用BPL做过,只用DLL做过,应该一样。BPL里面应该引出一个创建类的过程,主程序里面也不必关心获得是一个什么对象。你只关心接口就行了。比如,在BPL里面引出一个CreateObject,返回类型为TImpInterface。调用程序只要引用你的接口单元就行了var myinterface: IMy_interface;myinterface := IMy_interface(CreateObject)居然用到接口的话表明你主要关心的是接口的部分的方法和数据成员,所以你的调用程序也只需要获得接口就完了,不必是什么对象。而且建议使用Iinterface接口
 
更正一下,BPL里面返回类型应该是IMy_interfacemyinterface := CreateObject
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
687
import
I
后退
顶部