AGB  ·  Datenschutz  ·  Impressum  







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

GetPropList weigert sich

Ein Thema von Medium · begonnen am 10. Jan 2012 · letzter Beitrag vom 5. Jun 2019
 
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#1

GetPropList weigert sich

  Alt 10. Jan 2012, 10:43
Delphi-Version: 2007
Mahlzeit!

Vorab: Delphi 2007

Ich bräuchte eine Liste aller Properties von einer Instanz, wozu sich GetPropList() ja prima eignen sollte. Ich habe auch zig Codeschnipsel gefunden, die das scheinbar völlig problemlos verwenden, bei mir springt leider der Compiler raus.
Delphi-Quellcode:
function TMyObject.GetPropTexts(aObj: TMyObject): String;
var
  list: TPropList;
  propCount, i: Integer;
begin
  propCount := GetPropList(aObj, @list); // "Es gibt keine überladene Version von 'GetPropList', die man mit diesen Argumenten aufrufen kann"
  for i := 0 to propCount do
  begin
    ...
Auch probiert, mit dem selben Ergebnis: propCount := GetPropList(PTypeInfo(aObj.ClassInfo), @list); und propCount := GetPropList(aObj, PPropList(@list)); Wenn ich statt des Arrays gleich einen Pointer nehme:
Delphi-Quellcode:
function TMyObject.GetPropTexts(aObj: TMyObject): String;
var
  pList: PPropList;
  propCount, i: Integer;
begin
  propCount := GetPropList(aObj, pList);
  ...
Dann kompiliert das ganze zwar, läuft aber auf eine AV an Adresse $00000001. Ich hab nachgesehen: GetPropInfo alloziert die Liste via GetMem() selbst. Sollte also an sich auch gehen, und habe ich auch in manchen Quellfetzen im Netz gesehen!

Was mache ich hier verkehrt?

Besten Dank schon mal!


\\Edit: Mehr Infos.
Komisches passiert in dieser Funktion, die die Überladung mit PPropList-Parameter (also die kompilierende) aufruft:
Delphi-Quellcode:
function GetTypeData(TypeInfo: PTypeInfo): PTypeData; assembler;
asm
        { ->    EAX Pointer to type info }
        { <-    EAX Pointer to type data }
        {       it's really just to skip the kind and the name  }
        XOR EDX,EDX
        MOV DL,[EAX].TTypeInfo.Name.Byte[0]
        LEA EAX,[EAX].TTypeInfo.Name[EDX+1]
end;
In der 2. Zeile springt der Debugger auf einmal in die Classes.pas, und zwar in die Methode TThreadList.LockList. Was zum Henker will der DA!? Da jodelt der 2 Mal durch, und hängt dann was länger in der StdWndProc rum, und dann gibts irgendwann die o.g. AV. Wattatten?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (10. Jan 2012 um 10:52 Uhr)
  Mit Zitat antworten Zitat
 


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