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)