![]() |
Unitname anhand Objektreferenz ermitteln
Hi, ich möchte den Namen der implementierenden Unit eines Objekts ermitteln.
Dazu habe ich folgenden Code:
Delphi-Quellcode:
Wenn ich ein Objekt übergebe, dann funktioniert das auch recht schön: :thumb:
uses TypInfo;
function _GetUnitName(argObject: TObject): string; var ptrTypeData: PTypeData; begin if (argObject.ClassInfo <> nil) then begin ptrTypeData := GetTypeData(argObject.ClassInfo); Result := ptrTypeData.UnitName; end; end;
Delphi-Quellcode:
ABER, wenn ich das Objekt über einen Umweg ermittle, dann klappt das leider nicht mehr:
ShowMessage(_GetUnitName(Button1)); // Liefert StdCtrls
Delphi-Quellcode:
Hintergrund der Geschichte ist, dass ich
type
ITest = interface(IUnknown) ['{3270CA90-8F84-411E-A262-B7AFF9B87A43}'] function GetSelfPointer:TObject; end; TTest = class(TInterfacedObject, ITest) protected function GetSelfPointer:TObject; end; procedure TForm1.Button2Click(Sender: TObject); var test : ITest; obj : TObject; begin test := TTest.Create; obj := test.GetSelfPointer; ShowMessage(_GetUnitName(obj)); // liefert nichts // obj.ClassInfo ist nil, warum? end; ![]() Das wäre für alle DUnit-Benutzer ein kleines Sahnehäubchen obendrauf. |
Re: Unitname anhand Objektreferenz ermitteln
Geht
Delphi-Quellcode:
?
obj := test;
|
Re: Unitname anhand Objektreferenz ermitteln
Ein direkter, harter Cast klappt leider nicht:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var test : ITest; obj : TObject; begin test := TTest.Create; obj := TObject(test); ShowMessage(_GetUnitName(obj)); // endet leider in einer Zugriffsverletzung |
Re: Unitname anhand Objektreferenz ermitteln
Ein cast ist auch unnötig, da jedes Objejt ein TObject ist; sollte aber trotzdem funktionieren.
Hier scheint ompiler magic dazwischen zu funken |
Re: Unitname anhand Objektreferenz ermitteln
Zitat:
Anscheinend haben Interface und Objekt verschiedene VMTs (Virtual Method Table). Bei einem Interface geht ClassInfo also der Eintrag vmtTypeInfo irgendwie verloren. |
Re: Unitname anhand Objektreferenz ermitteln
Delphi-Quellcode:
Wenn es direkt geht, dann ließ es doch vor Ort aus und gib nur den Namen weiter?
ITest = interface(IUnknown)
['{3270CA90-8F84-411E-A262-B7AFF9B87A43}'] function GetUnitName: WideString; end; Es ist eh etwas wieder der Natur, wenn man von einem Interface das dahinter versteckte Objekt rausrückt. |
Re: Unitname anhand Objektreferenz ermitteln
Funktioniert doch ;-)
Delphi-Quellcode:
Gruß Hawkeye
{$M+}
TTest = class(TInterfacedObject, ITest) protected function GetSelfPointer:TObject; end; {$M-} |
Re: Unitname anhand Objektreferenz ermitteln
Zitat:
Zitat:
Delphi-Quellcode:
ITest = interface(IUnknown) // aus DUnit TestFramework
['{89CCD557-7DE1-4814-B033-ABAFE0870EC7}'] function GetName: string; function GetUnitName:string; // Neu! function CountTestCases: integer; function CountEnabledTestCases: integer; function Tests: IInterfaceList; |
Re: Unitname anhand Objektreferenz ermitteln
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz