Forum: Win32/Win64 API (native code)
by himitsu,
27. Mai 2011
Dank der Speicherausrichtung, kann das schnell mal schief laufen.
MyType = record
Var1: Byte;
Var2: LongInt;
end;
Laut deiner Berechnung/Zählung würde Var2 einen Offset von 1 haben, da SizeOf(Byte) = 1, aber standardmäig wird man einen Offset von 4 vorfinden.
Forum: Win32/Win64 API (native code)
by himitsu,
26. Mai 2011
function CONTAINING_RECORD(Address: Pointer; cType: PTypeInfo; Field: String): Pointer;
begin
Result := PAnsiChar(Address) - LongInt(@cType(nil).{Field});
end;
Das Problem ist jetzt allerdings, daß du dieses nichtmal direkt übersetzen kanns.
cType it wohl ein Record-Typ
Field ist der Name eines Feldes in diesem Record
Den Typ könntest du als PTypeInfo übergeben
Forum: Win32/Win64 API (native code)
by himitsu,
26. Mai 2011
Geht nicht.
Außer du schreibst dir einen Preprozessor für den Compiler, welcher sowas vorher noch schnell ausrechnet.
Lösung: Rechenvorschrift erkennen und die entsprechenden Werte überall direkt einsetzen.
Eventuell kann man sich auch ein Programm schreiben (falls es das nicht schon gibt), welches den wert berechnet, falls es mehrere werden.
Oder man muß weg von Konstanten und kann dann...