Interface能不能用于动态调入bpl包的程序?(100分)

  • 主题发起人 主题发起人 Dr.johns
  • 开始时间 开始时间
D

Dr.johns

Unregistered / Unconfirmed
GUEST, unregistred user!
我作了一个处理业务逻辑的类,用于提供查询数据库的功能,作成了bpl包,但在调用的时候,不知该怎么办了。
代码大致如下。
逻辑部分:
//接口
IUserMaint = Interface(IInterface)
['{D6C85A99-0093-4EFC-AB01-8FD3C7F4BE88}']
function QryBySwdm(strSwdm : string):OLEVariant

function Brow : OLEVariant

function QryByBluy(StrKey : string) : OLEVariant

//查询数据库的类
TUserMaint = class(TComponent, IUserMaint)
private
UserDM: TMmcxSbDMF

public
function QryBySwdm(strSwdm : string):OLEVariant

function Brow : OLEVariant

function QryByBluy(StrKey : string) : OLEVariant

constructor Create(aOwner : TComponent)
override

destructor Destroy
override

end

注册的类名为“TUserMaint”


界面部分,该单元已包含了接口单元
在创建bpl导出的对象时出错了。
var
aUser : IUserMaint

aClass : TClass

begin
loadPackage('UserMaint.bpl')

aClass :=GetClass('TUserMaint')

aUser := aClass.create(inl);//出错了(矛盾的类型赋值),但不这样又如何调用TUserMaint中的方法呢?
end

本例暂时不考虑生存期的问题,如何解决。
在XWing给我例子中,调用的是窗体,刚好有个CreateForm函数,只有对aClass进行转型即可,application.CreateForm(TComponentClass(aClass),aForm)

但在本例中,查了一下,getClass后,aClass的类型是TPersistentClass,转型好像不行,应为TPersistentClass不能创建对象,所以我把原来TUserMaint的基类一直从TObject(还不能注册)升级到了TComponent,还是不行。请高手指点。
 
TUserMaint = class(TInterfacedPersistent, IUserMaint)
 
还不明白请联系我的QQ
 
定义一个这样的类也没有用,我想调用动态调入的bpl中的类的自己的方法。但是,我调试了一下,在编译期,getClass定义返回的是TPersistent而实际返回的是一个TObject类型。这样就不能向下转型了,所以得不到要的类对象。用GetProcAdd函数的话,但要调用的是对象方法,所以不知怎么办了,高手去哪里了。
 
首先注册类 RegisterClass(TUserMaint),然后

var
AClass: TPersistentClass;
AObject: TUserMaint;
aUser : IUserMaint
begin
AClass := GetClass('TUserMaint');
AObject := TUserMaint(AClass).Create;
aUser := AObject;
aUser.YourMethod
.....
end;
 
在调用的单元是没有Uses TUserMaint的单元的,如果照你的写法,就失去了动态调入bpl引入原类再创建该类的对象这一目标,之所以用Interface是象通过实现了接口的对象与接口赋值兼容的规则,骗过编译器。但我的方法不行,想知道有没有可行的方法。
 
用QQ跟我说!
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1687832
我的一片老帖子,有帮助么
 
to wr960204
你的贴子我看了,很又价值,有人提到DLL+interFace,我就是因为这样才提出这个问题的。能不能搞诉我如何从包中导出函数,最好给个例子,这样的话,就能实现了。
 
在LargeWang的帮助下,我的问题解决了,现贴源码如下。
在IUserMaint单元加入如下代码
TBaseClassClass = class of TBaseClass
//基础类的类引用类型。
TBaseClass = class (TPersistentClass,IUserMaint)
//基础类,抽象的
protected
function QryBySwdm(strSwdm : string):OLEVariant
virtual
abstract;
function Brow : OLEVariant
virtual
abstract;
function QryByBluy(StrKey : string) : OLEVariant
virtual
abstract;
public
constructor Create(AOwner: TComponent)
virtual;
end;
//////////////////////
对UserMaint单元做如下修改
Type
TUserMaint = class (TBaseClass,IUserMaint) //注意,TUserMaint继承自TBaseClass
public
function QryBySwdm(strSwdm : string):OLEVariant
virtual
override;
function Brow : OLEVariant
virtual
override;
function QryByBluy(StrKey : string) : OLEVariant
virtual
override;
end;
/////////////////////////////////////
调用的界面单元,需包含IUserMaint单元
创建对象部分
var
aClass : TBaseClassClass;
User : IUserMaint;
begin
loadpackage('userMaint.bpl');
aClass := TBaseClassClass(GetClass('TUserMaint');//通过编译的关键,类型转换。
user := aClass.Create(self);
end;

感谢LargeWang的帮助,给分90。希望不要见怪,还有10分谢谢Wr960204给我推荐了一篇好资料,希望不要嫌少。
 
GetProcAddress
 
后退
顶部