Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 06, 2025 05:19

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: FPC + vmtSelfPtr
BeitragVerfasst: Do Jul 22, 2010 15:52 
Offline
DGL Member
Benutzeravatar

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?

mfg Frenk


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FPC + vmtSelfPtr
BeitragVerfasst: Do Jul 22, 2010 17:38 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FPC + vmtSelfPtr
BeitragVerfasst: Do Jul 22, 2010 18:24 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FPC + vmtSelfPtr
BeitragVerfasst: Do Jul 22, 2010 18:32 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: FPC + vmtSelfPtr
BeitragVerfasst: Do Jul 22, 2010 19:22 
Offline
DGL Member
Benutzeravatar

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.

mfg FrenK


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 16 Queries | GZIP : On ]