Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#8

AW: Ist im Prozedurzeiger eine Klasse drin?

  Alt 4. Feb 2011, 14:37
Das geht aber nur, da der Speicher der Application-Instanz zufällig hinter dem Programmcode und der Speicher für die zu testende Instanz zufällig hinter der Application.Instanz im "RAM" liegt ... davor ist aber auch noch genug Platz.

Hab jetzt erstmal das hinbekommen.
(Zum Glück sollte es sich bei mir immer um gültige Klassenzeiger oder Objektinstanzen handeln.)
Delphi-Quellcode:
var
  P, P2: Pointer;
  C: LongWord;
  X: array[1..vmtCreateObject - vmtSelfPtr] of Byte;
  Proc: procedure of object;

// IsClass(TTest)
P := PAnsiChar(TMethod(Proc).Data) + vmtSelfPtr;
if (ReadProcessMemory(GetCurrentProcess, P, @X, SizeOf(X), C))
    and (C = SizeOf(X)) and (PPointer(P)^ = TMethod(Proc).Data)
    and (TClass(TMethod(Proc).Data).InheritsFrom(TTest)) then
  Beep;

// IsObject(TTest)
P := TMethod(Proc).Data;
if ReadProcessMemory(GetCurrentProcess, P, @X, SizeOf(Pointer), C) and (C = SizeOf(Pointer)) then begin
  P2 := PPointer(P)^;
  P := PAnsiChar(P2) + vmtSelfPtr;
  if ReadProcessMemory(GetCurrentProcess, P, @X, SizeOf(X), C)
      and (C = SizeOf(X)) and (PPointer(P)^ = P2)
      and (TObject(TMethod(Proc).Data) is TTest) then
    Beep;
end;

//ReadProcessMemory als Ersatz für IsBadReadPtr
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat