Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#1

TypeInfo über IID oder Klasse (und RTTI)

  Alt 21. Jul 2005, 12:28
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?
gruß, choose
  Mit Zitat antworten Zitat