gpt4 book ai didi

delphi - 在Delphi中是否可以将接口(interface)绑定(bind)到未实现它的对象

转载 作者:行者123 更新时间:2023-12-03 14:41:35 25 4
gpt4 key购买 nike

我知道 Delphi XE2 有新的 TVirtualInterface,用于在运行时创建接口(interface)的实现。不幸的是我没有使用 XE2,我想知道在旧版本的 Delphi 中做这种事情涉及什么样的黑客行为。

假设我有以下界面:

  IMyInterface = interface
['{8A827997-0058-4756-B02D-8DCDD32B7607}']
procedure Go;
end;

是否可以在运行时绑定(bind)到此接口(interface)而不需要编译器的帮助?

TMyClass = class(TObject, IInterface)
public
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
procedure Go; //I want to dynamically bind IMyInterface.Go here
end;

我尝试过简单的硬转换:

var MyInterface: IMyInterface;
begin
MyInterface := IMyInterface(TMyClass.Create);
end;

但是编译器阻止了这种情况。

然后我尝试了 as 转换,它至少编译了:

MyInterface := TMyClass.Create as IMyInterface;

所以我想关键是让QueryInterface返回一个指向正在查询的接口(interface)的实现的有效指针。我将如何在运行时构建一个?

我已经深入研究了 System.pas,所以我至少对 GetInterfaceGetInterfaceEntryInvokeImplGetter 的工作原理有一定了解。 (值得庆幸的是,Embacadero 选择保留 pascal 源以及优化的程序集)。我可能没读对,但似乎可以存在偏移量为零的接口(interface)条目,在这种情况下,还有另一种使用 InvokeImplGetter 分配接口(interface)的方法。

我的最终目标是模拟具有反射支持的语言中可用的动态代理和模拟的一些功能。如果我可以成功绑定(bind)到与接口(interface)具有相同方法名称和签名的对象,那么这将是重要的第一步。这有可能吗,还是我找错了树?

最佳答案

理论上可以在运行时向现有类添加对接口(interface)的支持,但这确实很棘手,并且需要 D2010 或更高版本才能支持 RTTI。

每个类都有一个VMT,VMT有一个接口(interface)表指针。 (请参阅 TObject.GetInterfaceTable 的实现。)接口(interface)表包含接口(interface)条目,其中包含一些元数据,包括 GUID 和指向接口(interface) vtable 本身的指针。如果您确实愿意,您可以创建接口(interface)表的副本(不要在原始表中执行此操作;您可能最终会损坏内存!)向其中添加一个新条目,其中包含带有指针的新接口(interface) vtable指向正确的方法(您可以通过使用 RTTI 查找它们来匹配),然后更改类的接口(interface)表指针以指向新表。

要非常小心。这种工作确实不适合胆小的人,而且在我看来,它的用处也有限。但是,是的,这是可能的。

关于delphi - 在Delphi中是否可以将接口(interface)绑定(bind)到未实现它的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7502832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com