Bonjour,
Cela fait des heures que je me prends la tête avec l'utilisation de RTTI sous Delphi XE6...
Je n'arrives pas à lister tous les noms / valeurs d'un record aussi bête que IMAGE_DOS_HEADER défini dans Windows.pas.
J'ai remarqué que le problème survient quand il tombe sur un array, logique semble t-il car il faudrait pouvoir aller plus en proffondeur, cependant j'ai essayé plein de méthodes j'obtiens à chaque fois une violation d’accès ou une exception "EInsufficientRTTI".
Des idées ???
La déclaration de IMAGE_DOS_HEADER de Windows.pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 var i : integer; fields : TArray<TRTTIField>; field : TRTTIField; RTTIType : TRTTIType; DosHeader : IMAGE_DOS_HEADER; begin allocconsole(); RTTIType := TRTTIContext.Create.GetType(TypeInfo(IMAGE_DOS_HEADER)); fields := RTTIType.getFields; for i := 0 to High(Fields) do begin field := Fields[i]; writeln(field.Name); writeln(field.getValue(@DosHeader).toString); // ERROR SUR e_res ET e_res2 QUI SONT DES ARRAY writeln('----'); end;
Remarque: je ne peux même pas tester quand j'arrive à e_res ou e_res2 si c'est un array, dés que je fais appel à la méthode getValue ça plante directe!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 _IMAGE_DOS_HEADER = record { DOS .EXE header } e_magic: Word; { Magic number } e_cblp: Word; { Bytes on last page of file } e_cp: Word; { Pages in file } e_crlc: Word; { Relocations } e_cparhdr: Word; { Size of header in paragraphs } e_minalloc: Word; { Minimum extra paragraphs needed } e_maxalloc: Word; { Maximum extra paragraphs needed } e_ss: Word; { Initial (relative) SS value } e_sp: Word; { Initial SP value } e_csum: Word; { Checksum } e_ip: Word; { Initial IP value } e_cs: Word; { Initial (relative) CS value } e_lfarlc: Word; { File address of relocation table } e_ovno: Word; { Overlay number } e_res: array [0..3] of Word; { Reserved words } e_oemid: Word; { OEM identifier (for e_oeminfo) } e_oeminfo: Word; { OEM information; e_oemid specific} e_res2: array [0..9] of Word; { Reserved words } _lfanew: LongInt; { File address of new exe header } end;
Je suis totalement perdu pour ce qu'il semble pourtant être quelque chose de très simple.
Merci d'avance pour votre précieuse aide !
Partager