我知道 Delphi XE2 有新的 TVirtualInterface 用于在运行时创建接口的实现。不幸的是我没有使用 XE2,我想知道在旧版本的 Delphi 中做这种事情涉及什么样的黑客行为。
假设我有以下界面:
IMyInterface = interface
['{8A827997-0058-4756-B02D-8DCDD32B7607}']
procedure Go;
end;
是否可以在运行时绑定到该接口而不需要编译器的帮助?
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
返回指向正在查询的接口的实现的有效指针。我将如何在运行时构建一个?
我已经研究过 System.pas 所以我至少模糊地熟悉如何GetInterface
, GetInterfaceEntry
and InvokeImplGetter
工作。 (值得庆幸的是,Embacadero 选择保留 pascal 源以及优化的程序集)。我可能没读对,但似乎可以存在偏移量为零的接口条目,在这种情况下,还有另一种方法可以使用分配接口InvokeImplGetter
.
我的最终目标是模拟具有反射支持的语言中可用的动态代理和模拟的一些功能。如果我可以成功绑定到与接口具有相同方法名称和签名的对象,那么这将是重要的第一步。这有可能吗,还是我找错了树?