Wiem, że Delphi XE2 ma nowy interfejs TVirtualInterface do tworzenia implementacji interfejsu w środowisku wykonawczym. Niestety nie używam XE2 i zastanawiam się, jaki rodzaj hackery jest zaangażowany w robienie tego typu rzeczy w starszych wersjach Delphi.W Delphi można powiązać interfejs z obiektem, który go nie implementuje.
Powiedzmy mam następujący interfejs:
IMyInterface = interface
['{8A827997-0058-4756-B02D-8DCDD32B7607}']
procedure Go;
end;
to możliwe, aby wiązać się z tego interfejsu w czasie wykonywania bez pomocy kompilatora?
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;
Próbowałem prosty dysk Obsada:
var MyInterface: IMyInterface;
begin
MyInterface := IMyInterface(TMyClass.Create);
end;
ale kompilator zapobiega temu.
Potem próbowałem as
obsady i to przynajmniej skompilowane:
MyInterface := TMyClass.Create as IMyInterface;
więc sobie wyobrazić, że kluczem jest dostać QueryInterface
powrócić ważny wskaźnik do implementacji interfejsu poszukiwanych. W jaki sposób chciałbym zbudować jeden w czasie wykonywania?
mam wykopane przez System.pas więc jestem co najmniej dziwnie znajomy z jak GetInterface
, GetInterfaceEntry
i InvokeImplGetter
pracy. (Na szczęście Embacadero zdecydował się opuścić źródło paschalne wraz ze zoptymalizowanym montażem). Być może nie czytam tego dobrze, ale wydaje się, że mogą istnieć wpisy interfejsu z przesunięciem zerowym, w którym to przypadku istnieje alternatywny sposób przypisania interfejsu przy użyciu InvokeImplGetter
.
Moim ostatecznym celem jest symulowanie niektórych umiejętności dynamicznych serwerów proxy i makr dostępnych w językach z obsługą refleksji. Jeśli uda mi się pomyślnie powiązać obiekt, który ma takie same nazwy i sygnatury metod, jak interfejs, byłby to duży pierwszy krok. Czy to jest możliwe, czy też szczerzę złe drzewo?
Jeśli musisz to zrobić, wtedy XE2 jest droga. Jest prosty w obsłudze dzięki TVirtualInterface. Bez tej klasy będzie ból i walka. W projekcie DelphiMocks podjęto próbę: http://bit.ly/o9GJVW –
Jeśli mi się uda, planowałem wnieść swój wkład do DelphiMocks. –
Może [to pytanie] (http://stackoverflow.com/questions/662875/virtual-library-interfaces-for-delphi-win32) jest dla Ciebie interesujące. –