Sé que Delphi XE2 tiene la nueva interfaz de TVirtual para crear implementaciones de una interfaz en tiempo de ejecución. Lamentablemente, no estoy usando XE2 y me pregunto qué tipo de piratería está involucrado en hacer este tipo de cosas en versiones anteriores de Delphi.En Delphi es posible vincular una interfaz a un objeto que no lo implementa
Digamos que tengo la siguiente interfaz:
IMyInterface = interface
['{8A827997-0058-4756-B02D-8DCDD32B7607}']
procedure Go;
end;
¿Es posible que se unen a esta interfaz en tiempo de ejecución sin la ayuda del compilador?
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;
He intentado un simple fundido duro:
var MyInterface: IMyInterface;
begin
MyInterface := IMyInterface(TMyClass.Create);
end;
pero el compilador lo impide.
Luego probé con un reparto as
y al menos compilar:
MyInterface := TMyClass.Create as IMyInterface;
Así que imaginemos la clave es conseguir QueryInterface
para devolver un puntero válido para una implementación de la interfaz que se está consultando. ¿Cómo podría construir uno en tiempo de ejecución?
He buscado en System.pas, así que estoy al menos familiarizado con el funcionamiento de GetInterface
, GetInterfaceEntry
y InvokeImplGetter
. (afortunadamente Embacadero eligió dejar la fuente pascal junto con el ensamblaje optimizado). Puede que no esté leyendo correctamente, pero parece que puede haber entradas de interfaz con un desplazamiento de cero, en cuyo caso hay un medio alternativo de asignar la interfaz usando InvokeImplGetter
.
Mi objetivo final es simular algunas de las capacidades de proxies dinámicos y burlas que están disponibles en idiomas con soporte de reflexión. Si puedo enlazar con éxito a un objeto que tenga los mismos nombres de método y firmas que la interfaz, sería un gran primer paso. ¿Es esto posible o estoy ladrando el árbol equivocado?
Si necesita hacer esto, entonces XE2 es el camino a seguir. Es muy simple con TVirtualInterface. Va a haber dolor y lucha sin esa clase. Hay un intento en el proyecto DelphiMocks: http://bit.ly/o9GJVW –
Si tengo éxito, estaba planeando contribuir con DelphiMocks. –
Tal vez [esta pregunta] (http://stackoverflow.com/questions/662875/virtual-library-interfaces-for-delphi-win32) es interesante para usted. –