Registriert: Mi Jan 31, 2007 18:32 Beiträge: 150
Programmiersprache: Pascal
Ich möchte gerne überprüfen ob es sich bei einem Zeiger um eine gültige Intanz handelt. Unter Delphi habe ich das immer über die vmt erledigt idem ich überprüft habe ob eben das feld vmtSelPtr gleich dem Zeiger ist, die FPC vmt besitzt dieses Feld scheinbar nicht ...
Ist irgendwem ein anderer Weg bekannt bzw. wie man unter FPC and vmtSelfPtr kommt?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich weiß nicht genau, was soll vmtSelfPtr denn tun? Die VMT ist doch Klassenspezifisch, nicht Objektspezifisch … Du könntest schauen, ob die ClassType-Methode noch einen Pointer zurückliefert, der zu einer VMT passt… Ich kann mir jedenfalls gut vorstellen, dass FPC da Größenoptimierung vornimmt, indem es alle möglichen VMTs nur einmal erzeugt und dann in der Objektinstanz nur darauf verweist. Dann gäbe es kein vmtSelfPtr.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mi Jan 31, 2007 18:32 Beiträge: 150
Programmiersprache: Pascal
TObject.ClassType liefert leider nur einen Zeiger Auf den Type da ich aber nicht weis von welchem Type der Zeiger ist habe ich keine Wert bei dem ich sagen kann es handelt sich um eine gültige Instanz. Dieser Wert wäre der fehlende vmtSelfPtr gewesen
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Naja, aber der Wert von ClassType muss kleiner als die größe der Executable sein, sonst ist er ungültig. Hieb und Stichfest ist die vmtSelfPtr Methode auch nicht. Es sei denn, du überschreibst den Speicher beim Freigeben mit irgendeinem Schrott.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mi Jan 31, 2007 18:32 Beiträge: 150
Programmiersprache: Pascal
Hab hier was brauchbares zusammengezimmer isPtr ist aus dem Quellcode des Debuggers zusammengebastelt und die beiden Felder der VMT werden von FPC intern ebenfalls zur überprüfung der VMT benutzt von daher sollte gewährleistet sein das die Methoden richtig arbeiten und das tun sie bis jetzt auch
Code:
function IsPtr(x: Byte): Boolean; inline; begin Result := (x and $0030) = (1 shl 4); end;
function IsObject(AObject: Pointer): Boolean; type TVMT = record InsSize : Ptrint; InvInsSize : Ptrint; end; var PVMT : ^TVMT; Begin Result := False; if AObject = nil then Exit; PVMT := PPointer(AObject)^; if PVMT = nil then Exit; if not IsPtr(Byte(PVMT)) then Exit; Result := PVmt^.InsSize = - PVmt^.InvInsSize; end;
Edit : IsPtr tuts noch nicht ganz wenn ich den fehler gefunden habe korriegiere ich das hier noch.
Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.