关于Delphi接口不能强制转化的补充说明

其实Delphi为了速度的原因,对于接口是采用直接解析接口在实例中的偏移来得到的.这个可以从下面的代码中看到:

var
mInt: ITestInterface;
mInt2: ITestInterface2;
begin
mInt :
=  TTestInterface2.Create;
mInt2 :
=  TTestInterface2.Create;
end;


其中 mInt := TTestInterface2.Create 代码为:
mov dl, $ 01
mov eax, [$00452e4]
call TObject.Create
mov edx, eax
jz 
+ $ 03
sub edx, 
- $0C
lea eax, [ebp
- $ 04 ]
call @IntfCopy

而 mInt2 := TTestInterface2.Create 代码为:
mov dl, $ 01
mov eax, [$00452e4]
call TObject.Create
mov edx, eax
jz 
+ $ 03
sub edx, 
- $0C
lea eax, [ebp
- $ 08 ]
call @IntfCopy


但 对于接口之间的转化时, CSDN的halfdream(哈欠) 兄说的很对, Delphi在call @IntfCast里调用了@QueryInterface, 而这里面的代码, 其实是在System的TObject对象的GetInterface这个方法中, 但这个方法有个问题, 它需要GUID, 但我们实际可以在Delphi中使用无GUID的接口, 那么就会发现, 根本无法进行转化

比如:
INoGUIDInterface  =   interface
procedure NoGUID;
end;

INoGUIDInterface2 
=   interface
procedure NoGUID2;
end;

var
mInt: INoGUIDInterface;
mInt2: INoGUIDInterface2;
begin
mInt :
=  TTestNoGUIDInterface2.Create;
mInt.NoGUID;

mInt2 :
=  mInt  as  INoGUIDInterface2;
mInt2.NoGUID2;
end;


编译就会出错了, Operator not applicable to this operand type 根本就不支持. 所以表明接口时还是随手加上GUID的比较好 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值