Hallo zusammen,
nach meiner Auffassung besitzt jedes Interface mit IID, das von einer Klasse implementiert wird auch TypInfoformationen, die über den Aufruf von
TypeInfo(IAnInterfaceName)
abgefragt werden können. Sieht man sich das Kompilat genauer an, ist eine "magische" Adresse zu erkennen, an der eine Referenz auf die Daten abgelegt ist. Diese Zahl wird auch bei Aufrufen von
TypeInfo bei anderen Typen vom Compiler generiert und kann meines Wissens nicht anders als eben über diese Funktion/Operator erlangt werden.
Objekte und Klassen bieten mit
TObject.ClassInfo darüber hinaus auch zur Laufzeit die Möglichkeit, auf dieser Daten zuzugreifen, so dass Konstruktue wie
Delphi-Quellcode:
function GetUnit(const AnObject: TObject): string;
begin
Result := GetTypeData(AnObject.ClassInfo).UnitName;
end;
u.a. erlauben, den Unitbezeichner der Klasse eines Objekts zu ermitteln (sofern die Klasse mit Typinformationen kompiliert wurde, siehe
OH).
Mein Problem ist etwas anders gestaltet.
Ich suche nach einer Möglichkeit, die erste Referenz auf ein
TTypeInfo-Record des Interfaces mit einem IID einer Klasse oder seinem Vorfahren zu erlangen.
Delphi-Quellcode:
type
IMyInterface = interface
['AnIID']
procedure AMethod;
end;
TMyClass = TInterfacedObject(IMyInterface)
procedure AMethod;
end;
function GetTypeInfoOfFirstInterface(const AClass: TClass): PTypeInfo;
Der Rückgabewert von
GetTypeInfoOfFirstInterface sollte im skizzierten Fall dasselbe Resultat bringen wie
Assert( TypeInfo(IMyInterface)=GetTypeInfoOfFirstInterface(TMyClass) );
Über
TObject.GetInterfaceTable bekomme ich für jedes durch eine Klasse implementierte Interface mit IID eine Referenz auf das Record
TInterfaceEntry mit
Delphi-Quellcode:
type
TInterfaceEntry = packed record
IID: TGUID;
VTable: Pointer;
IOffset: Integer;
ImplGetter: Integer;
end;
ich kann aber leider nicht entdecken, ob ich auf diesem Weg an die Typinformationen herankomme.
Selbstverstädnlich würde sich auch eine Technik anbieten, bei der die Typinformationen (sofern vorhanden) über einen IID ermittelt werden.
Weiß jemand von Euch eine Lösung?