AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Pointer is TObject?

Ein Thema von Neutral General · begonnen am 3. Dez 2007 · letzter Beitrag vom 4. Dez 2007
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Pointer is TObject?

  Alt 3. Dez 2007, 13:41
Hi,

Wie kann man herausfinden ob ein Pointer auf ein Objekt zeigt? Also die Methode der Überschrift funktioniert (schon allein vom Compiler her) nicht.

Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Nuclear-Ping
(Gast)

n/a Beiträge
 
#2

Re: Pointer is TObject?

  Alt 3. Dez 2007, 13:44
Gibts da nicht IsObject oder IsClass?
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Pointer is TObject?

  Alt 3. Dez 2007, 13:55
mal einfach ins blaue geraten:
Delphi-Quellcode:
if MyPointer <> NIL then
  if MyPointer^ is TObject then
    // ...;
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Pointer is TObject?

  Alt 3. Dez 2007, 14:11
Zitat von Nuclear-Ping:
Gibts da nicht IsObject oder IsClass?
IsClass gibt es (wenn auch versteckt). Wird aufgerufen, wenn man dies schreibt: "if Sender is TIrgendetwas".
(TIrgendetwas darf nur nicht TObject sein, da wird nur überprüft ab Sender<>nil ist)
Es wird dann TObject.Inheritsfrom aufgerufen, was bei allen "NichtObjekten" zu einem Fehler führen könnte. Damit hätte man dies überprüft.

Ähnliches erreicht man z.B. damit:
Delphi-Quellcode:
function isObject(aObject:pointer):boolean;
//type ppointer=^pointer;
var pp:ppointer;
begin
  pp:=pointer(aObject);
  try
    result:= (ppointer(integer(pp^)+vmtselfptr)^=pp^)
  except
    result:=false;
  end;
end;
...um mal so die grundlegende Struktur eines Objektes zu überprüfen.

Direkt eine gängige Funktion bzw überhaupt eine Möglichkeit ist mir nicht bekannt. Es wird ja nirgends gespeichert, was in dem Pointer ist.
Du könntest es allerdings mit TVarRec bzw. sogar Variant umgehen (bei letzterem bin ich mir nicht sicher).
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Pointer is TObject?

  Alt 3. Dez 2007, 17:12
Hi,

Habs jetzt so gemacht und das funktioniert bisher ganz gut:

Delphi-Quellcode:
function IsObject(p: Pointer): Boolean;
begin
  Result := TObject(p).ClassType <> nil;
end;
Gruß
Neutral General
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von peschai
peschai

Registriert seit: 15. Feb 2004
Ort: Göppingen
270 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Pointer is TObject?

  Alt 4. Dez 2007, 06:45
@Neutral General:
Macht BUMM wenn dein pointer NIL ist ... Try except end ?
... un dbin mir nicht sicher wie verlässlich das ist ?
Peter Schaible
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Pointer is TObject?

  Alt 4. Dez 2007, 07:30
Ich glaub all diese Methoden können BUMM machen. Hat man Beispielsweise einen Pointer der nur auf ein einzelnes Byte zeigt und es wird versucht mehr zu lesen dort wo er hinzeigt kann es gewaltig BUMM machen (denke ich zumindest).
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Pointer is TObject?

  Alt 4. Dez 2007, 08:32
Delphi-Quellcode:
function isObject(aObject: Pointer): Boolean;
// wenn PPointer nicht definiert ist, dann PInteger verwenden
begin
  try
    Result := PPointer(aObject)(PInteger(aObject)^ + vmtselfptr)^ = PPointer(aObject)^;
  except
    Result := false;
  end;
end;
@SirThornberry: drum hatte ich gestern mal versucht sirius ohne Try-Except, aber dafür mit IsBadReadPtr umzuschreiben, aber
MSDN: This function is obsolete and should not be used.
leider gibt es wohl keinen Ersatz dafür und mam müßte auch noch mehrere (mindestens 5) Speicherbereich überprüfen, so daß ich es bei Try-Except beließ.

da hier mehrere Werte geprüft werden, ist die Wahrscheinlichkeit, daß man ein Ojekt richtig erkenne natürlich höher, aber selbst hier kann man reinfallen ... nichts ist 100%ig sicher (wen man rein zufällig eine Struktur vorfindet, wo passende Werte drin vorkommen)

Nja, 100%ig geht nicht, man kann höchstens soviel wie möglich prüfen
(vmtTypeInfo, vmtClassName und vmtInstanceSize bieten sich noch an),
aber da sirius einen Bereich auf nur einen bestimmten Wert überprüft und diese(r) Bereich(e) auch noch mehrmals umgeleitet werden, sollte sich schon eine hohe Wahrscheinlichkeit ergeben, daß sein Ergebnis stimmt.

wenn man alleine von den Wertebereichen der verglichenen Bereiche ausgeht, dann liegt das bei:
(also wenn alle (De)Refferenzierungen ohne Exception ablaufen)
sirius: Pointer = Pointer : 1 von 64 Bit richtig = 99,999999999999999994578989137572%
Neutral General: Pointer <> 0 : 1 von 32 Bit falsch = 0,000000023283064365386962890625%

Result := TObject(p).ClassType <> nil; dieses wird aber wohl oft nicht so funktionieren, denn
Delphi-Quellcode:
function TObject.ClassType: TClass;
begin
  Pointer(Result) := PPointer(Self)^;
end;
was dann auf dieses rauskommt:
Result := PPointer(P)^ <> nil; wenn P = nil oder wenn P oder PPointer(P)^ auf einen Speicher ohne Leserechte oder einen nicht Vorhandenen zeigt, dann kracht's.
Und wenn PPointer(P)^ <> nil, dann heißt es noch lange nicht, daß es ein Objekt ist, da es ja dem entspricht PInteger(P)^ <> 0 und dort alles ungleich 0 (egal was es ist) als Richtig anerkannt wird.

PS: zu Neutral General's IsObject
Delphi-Quellcode:
function IsObject(p: Pointer): Boolean;
begin
  try
    Result := TObject(p).ClassType <> nil;
  except
    Result := False;
    Application.MessageBox('Ohhh, eine Exception', 'Fehler');
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var S: String;
begin
  S := '';
  If not IsObject(Pointer(S)) Then
    Application.MessageBox('"" ist kein Object', 'OK');

  S := '123';
  If IsObject(Pointer(S)) Then
    Application.MessageBox('"123" ist ein Object °_°', 'Falsch');
end;
Anworten wie sie vom Programm hintereinander angezeigt werden {incl. meiner Kommentare}:
Ohhh, eine Exception {war klar, weil P=nil}
"" ist kein Object {jupp, nil ist kein Object}
"123" ist ein Object °_° {nja, PPointer(P)^ is zumindestens nicht nil, also stimmt *hust*}
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Lossy eX
Lossy eX

Registriert seit: 7. Aug 2007
113 Beiträge
 
#9

Re: Pointer is TObject?

  Alt 4. Dez 2007, 09:11
Wäre es nicht evtl besser, wenn man gar nicht erst in solch eine Lage kommen würde? Das auf so eine Art und Weise überprüfen zu müssen halte ich generell für Fragwürdig. Zu mal ich solch einen Stil auch für unsauber halte. Ich versuche mal was und wenn es nicht klappt, dann hoffe ich, dass der Exceptionblack mir schon den Arsch retten wird. Das Beste ist gar nicht erst in solche Situationen zu kommen. Und für mich schreit das nach einem Designfehler innerhalb des Programms. Aber das kann ich nicht abschätzen, da ich das Programm nicht kenne.
Ich habe ja keine Vorurteile gegenüber Autofahrern ... aber Fahrer von BMW und Mercedes bestätigen diese regelmäßig.
Außerdem neue technologische Errungenschaften: Serienmäßig eingebaute Rechtsfahrsperre und der stromsparende Blinker.
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#10

Re: Pointer is TObject?

  Alt 4. Dez 2007, 15:19
Du sprichst mir aus der Seele.
Moritz
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz