Einzelnen Beitrag anzeigen

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