Dass das hooken von .Free nichts bringt, hast du ja schon gesehen.
Also musst du .Destroy abfangen.
Diese Methode ist aber in der
VMT abgelegt.
Ich hätte hier 2 (ungetestete!!!) Varianten anzubieten:
Delphi-Quellcode:
function GetDestructor(AClass:TClass):Pointer;
asm
TEST EAX,EAX
JE @@exit
MOV EAX, [EAX].vmtDestroy
@@exit:
end;
function GetDestructor2(AClass:TClass):Pointer;
begin
if Assigned(AClass)
then
begin
Result := Pointer(AClass);
Result := Pointer(PInteger(PChar(Result)+vmtDestroy)^);
end
else
Result :=
nil;
end;