关于Delphi接口不能强制转化的补充说明
2006-10-30 11:11
435 查看
其实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的比较好
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的比较好
相关文章推荐
- 对于delphi7的接口不能强制转化的问题
- 关于对话框不能响应OnKeyDown和OnChar函数的一些说明
- 关于Oracle中supplemental log的补充说明
- 学习到的关于Delphi的接口
- [声明]关于春节回家期间不能更新Blog的说明
- 关于《Linux.NET学习手记(8)》的补充说明
- 关于强制转化后的风险
- Android Service的绑定 续篇:关于绑定的补充说明
- 关于指针的强制转化之一(基类没有…
- 关于firefox的ElementTraversal 接口 使用说明
- 关于“Web 2.0样式”的补充说明
- FreeTextBox 1.6.3 中文版使用说明(后加关于图片设置的补充)
- delphi:斑马打印机ZPL指令打印中文及二维码,补充说明
- 8. 关于开发和实施的补充说明
- 关于Extjs4开发笔记(二)的补充说明
- 关于强制横竖屏的几点说明
- 关于“幽灵架构”的补充说明3:为什么不会产生“循环引用”
- 关于Java接口interface定义的几点说明
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 关于AgileEAS.NET的一些补充说明
- 关于在“VC2008 Express下安装OpenCV2.3.1”的补充说明