Hi, ich möchte den Namen der implementierenden
Unit eines Objekts ermitteln.
Dazu habe ich folgenden Code:
Delphi-Quellcode:
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;
Wenn ich ein Objekt übergebe, dann funktioniert das auch recht schön:
ShowMessage(_GetUnitName(Button1)); // Liefert StdCtrls
ABER, wenn ich das Objekt über einen Umweg ermittle, dann klappt das leider nicht mehr:
Delphi-Quellcode:
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;
Hintergrund der Geschichte ist, dass ich
DUnit so erweitern möchte, dass zusätzlich noch der Unitname angezeigt wird.
Das wäre für alle DUnit-Benutzer ein kleines Sahnehäubchen obendrauf.