问一个关于两个接口相转换的问题. ( 积分: 25 )

  • 主题发起人 主题发起人 QSmile
  • 开始时间 开始时间
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
两个接口,如下:
Interface1 = interface
procedure DoIt1;
end;

Interface2 = interface
procedure DoIt2;
end;

我用一个对象来实现它们
TObject2 = class(TInterfacedObject, Interface1, Interface2)

代码中我这样用:
var
intf1 :Interface1;
intf2 :Interface2;
begin
intf2 := Interface2(TObject2.Create);
intf2.DoIt2;
intf1 := intf2 as Interface1
// <--- 这句出错, 为什么呢?
intf1.DoIt1;


我是照书上写的, 书上说可以. <Delphi COM 深入编程> 这本书上的例子

我哪里做错了吗?
 
搞定了.

我看你们能想到答案吗? 三天后我揭贴.
 
Interface1 和 Interface2 没有继承关系,这样用会有问题。

if Supports(intf2, Interface1, intf1) then
intf1.DoIt1;
 
楼上说得对,Interface1 和 Interface2 没有继承关系。
肯定要出错了,再有我觉得应该用类来实现。不是你说的对象。
 
公布答案了

var
itf :IUnknown
// <---- 加多一个 IUnkown
intf1 :Interface1;
intf2 :Interface2;
begin

itf := TObject2.Create;
itf.QueryInterface(Interface1, intf1)
// <----- 用这样得到接口, 要判断是否返回 S_OK;
intf1.DoIt1;

itf.QueryInterface(Interface2, intf2);
intf2.DoIt2;
 
喔,还有一个,每个接口要定议一个 GUID
 
多人接受答案了。
 
后退
顶部