Я знаю, что у 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
и InvokeImplGetter
. (к счастью, Эмбакадеро решил оставить источник паскаля вместе с оптимизированной сборкой). Я, возможно, не читаю его правильно, но кажется, что могут быть записи интерфейса со смещением нуля, и в этом случае есть альтернативный способ назначения интерфейса с помощью InvokeImplGetter
.
Моя конечная цель - имитировать некоторые возможности динамических прокси и макетов, которые доступны на языках с поддержкой рефлексии. Если я могу успешно привязать объект, который имеет те же имена методов и подписи, что и интерфейс, это будет большой первый шаг. Возможно ли это, или я лаяю неправильное дерево?