Tja, als erstes hast du mal einen großen Fehler in deinem Record. (zumindestens da im Post #1)
Oder hast du das cbSize absichtlich weggelassen?
Code:
// blöde Formatierung der [delphi]-Tags ... wird das denn irgendwann mal repariert? (ich mag meine Leerzeichen nämlich)
uses
RTTI;
type
{$ALIGN 8}
TBBUTTONINFO64 = record
cbSize: UINT;
ewMask: DWORD;
idCommand: {int}LongInt;
iImage: {int}LongInt;
fsState: BYTE;
fsStyle: BYTE;
cx: WORD;
lParam: DWORD_PTR;
pszText: LPTSTR;
cchText: {int}LongInt;
end;
procedure TForm11.Button1Click(Sender: TObject);
var
R: TRttiRecordType;
F: TRttiField;
begin
R := TRttiContext.Create.GetType(TypeInfo(TBBUTTONINFO64)) as TRttiRecordType;
Memo1.Lines.Add(
' Offset: ' +
' Size: ' + IntToStr(R.TypeSize) +
' Type: ' + R.Name);
for F in R.GetFields do
Memo1.Lines.Add(
' Offset: ' + IntToStr(F.Offset) +
' Size: ' + IntToStr(F.FieldType.TypeSize) +
' Type: ' + F.FieldType.QualifiedName +
' Name: ' + F.Name);
end;
Unter 32 Bit sieht es wie folgt aus.
Code:
Offset: 0 Size: 32 Type: TBBUTTONINFO64
Offset: 0 Size: 4 Type: System.Cardinal Name: cbSize
Offset: 4 Size: 4 Type: System.Cardinal Name: ewMask
Offset: 8 Size: 4 Type: System.Integer Name: idCommand
Offset: 12 Size: 4 Type: System.Integer Name: iImage
Offset: 16 Size: 1 Type: System.Byte Name: fsState
Offset: 17 Size: 1 Type: System.Byte Name: fsStyle
Offset: 18 Size: 2 Type: System.Word Name: cx
Offset: 20 Size: 4 Type: System.Cardinal Name: lParam
Offset: 24 Size: 4 Type: System.PWideChar Name: pszText
Offset: 28 Size: 4 Type: System.Integer Name: cchText
Mit 64 Bit kann ich's grade nicht testen.