如何投下接口在Delphi中一个对象

德尔福2009年我有一个参照IInterface我想转换为底层TObject

使用TObject(IInterface)显然不德尔福2009年工作(它应该在2010年德尔福虽然工作)

我的搜索使我应该做的伎俩功能,但它不为我工作,我得到AV的,当我尝试调用返回的对象的方法。

我真的不能修改类和我知道,这打破了OOP

--------------解决方案-------------

而不是依靠德尔福的内部对象布局,你也可以有你的对象实现这只会返回对象的另一个接口。 这,当然,只有当你有机会到开始与对象的源代码,但你可能甚至不应该使用这些黑客如果您没有访问该对象的源代码。

interface

type
IGetObject = interface
function GetObject: TObject;
end;

TSomeClass = class(TInterfacedObject, IGetObject)
public
function GetObject: TObject;
end;

implementation

function TSomeClass.GetObject: TObject;
begin
Result := Self;
end;

你是对的。 德尔福2010年开始,您就可以使用as运算符,例如通过aObject := aInterface as TObject甚至aObject := TObject(aInterface)

as运营商使用的特殊隐藏接口的ObjCastGUID来检索对象实例,调用一个增强版的TObject.GetInterface并不存在之前,德尔福2010年。参见源代码System.pas单元,看看它是如何工作的。

我发表了一些代码工作德尔福6至XE2,包括德尔福2009年。

见http://blog.synopse.info/post/2012/06/13/Retrieve-the-object-instance-from-an-interface

总之:你不应该或返回指针为你的方法添加的接口。 还有什么是两轮牛车。

请注意,一个界面中的“实例”,可以用另一种语言来实现(它们是COM兼容)和/或可为存根​​的东西出来工艺等等等等。

所有的一切:一个接口实例只同意给接口,没有别的,肯定不会被实现为德尔福TObject的实例

Hallvard的黑客是非常具体的如何Delphi编译器生成代码。 这一直是非常稳定,在过去,但它听起来像是他们改变东西显著德尔福2009年我只有在这里2007年安装,并在这,Hallvard的代码工作正常。

难道GetImplementingObject返回NIL?

如果是这样的话,如果你调试和设置在CASE语句一个突破点在GetImplementingObject程序,什么QueryInterfaceThunk.AddInstruction的价值评估在调试器?

有知道什么时候实施对象是一个不错的选择TComponent后代。

您可以使用IInterfaceComponentReference接口,其定义在Classes单位:

IInterfaceComponentReference = interface
['{E28B1858-EC86-4559-8FCD-6B4F824151ED}']
function GetComponent: TComponent;
end;

然后它被声明TComponent (和实施,以恢复self ):

TComponent = class(TPersistent, IInterface, IInterfaceComponentReference)

所以,如果你知道的实施对象是一个TComponent ,那么你可以这样做:

function InterfaceToComponent(const AInterface: IInterface): TComponent;
var
vReference: IInterfaceComponentReference;
begin
if Supports(AInterface, IInterfaceComponentReference, vReference) then
result := vReference.GetComponent
else
result := nil;
end;

var
N, F: NativeInt; // NativeInt is Integer(in delphi 32bit )
S: TObject;
begin
N := NativeInt(Args[0].AsInterface) - 12;
{subtract 12 byte to get object address(in x86 ,1 interface on class) }
S := TObject(N);
writeln(S.ToString);

end;

分类:德尔福 时间:2012-01-01 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.022 (s). 10 q(s)