this slowpoke moves

Packed Record Example

type
// Normale einmal verschachtelte Union
  PMyString = ^TMyString;
  TMyString = packed record
    case Integer of
      0: (Len, Checksum: DWORD);
      1: (Prev, Next: PMyString;
        szText: PChar;
        )
  end;

  PMyStringV2 = ^TMyStringV2;
  TMyStringV2 = packed record
    case Integer of
      0: (Len, Checksum: DWORD);
      1: (Prev, Next: PMyString;
        szText: PChar;
        case Integer of
          0: (file1: THandle);
          1: (
            case Integer of
              0: (icon1: HICON);
              1: (
                cursor1: THandle;
                OtherElements: array[0..1] of DWORD;
                )
              )
          )
  end;

  TMyStringV2R = packed record
    union1: record // start 1st union record
      case Integer of
        0: (Len, Checksum: DWORD);
        1: (Prev, Next: PMyString);
    end; // 1st record ends here
    szText: PChar;
    union2: record // start 2nd union record
      case Integer of
        0: (file1: THandle);
        1: (union3: record // start 3rd union record
            case Integer of
              0: (icon1: HICON);
              1: (cursor1: THandle);
          end; ) // 3rd union record ends here
    end; // 2nd union record ends here
    OtherElements: array[0..1] of DWORD;
  end;

(* 01 und 02 sind die ersten beiden Varianten *)
  TMyStringV2_01 = packed record
    Len, Checksum: DWORD; // Dieser teil unterscheidet sich
    szText: PChar;
    file1: THandle;
    OtherElements: array[0..1] of DWORD;
  end;

  TMyStringV2_02 = packed record
    Prev, Next: PMyString; // Dieser teil unterscheidet sich
    szText: PChar;
    file1: THandle;
    OtherElements: array[0..1] of DWORD;
  end;


  TMyStringV2_03 = packed record
    Len, Checksum: DWORD; // Dieser teil unterscheidet sich zwischen 03/04 und 05/06
    szText: PChar;
    cursor1: THandle; // Dieser teil unterscheidet sich
    OtherElements: array[0..1] of DWORD;
  end;

  TMyStringV2_04 = packed record
    Len, Checksum: DWORD; // Dieser teil unterscheidet sich zwischen 03/04 und 05/06
    szText: PChar;
    icon1: HICON; // Dieser teil unterscheidet sich
    OtherElements: array[0..1] of DWORD;
  end;

  TMyStringV2_05 = packed record
    Prev, Next: PMyString; // Dieser teil unterscheidet sich zwischen 03/04 und 05/06
    szText: PChar;
    cursor1: THandle; // Dieser teil unterscheidet sich
    OtherElements: array[0..1] of DWORD;
  end;

  TMyStringV2_06 = packed record
    Prev, Next: PMyString; // Dieser teil unterscheidet sich zwischen 03/04 und 05/06
    szText: PChar;
    icon1: HICON; // Dieser teil unterscheidet sich
    OtherElements: array[0..1] of DWORD;
  end;

{
//Beispiel für eine reale Verwendung - die NT Native API:

  _SYSTEM_PROCESSES = packed record // Information Class 5
    NextEntryDelta,
      ThreadCount: ULONG;
    Reserved1: array[0..5] of ULONG;
    CreateTime,
      UserTime,
      KernelTime: LARGE_INTEGER;
    ProcessName: UNICODE_STRING;
    BasePriority: KPRIORITY;
    ProcessId,
      InheritedFromProcessId,
      HandleCount: ULONG;
    Reserved2: array[0..1] of ULONG;
    VmCounters: VM_COUNTERS;
    case Integer of
      0: (NT4: NT4_EOSYSTEM_PROCESSES);
      1: (NT5: NT5_EOSYSTEM_PROCESSES);
  end;
  SYSTEM_PROCESSES = _SYSTEM_PROCESSES;
  PSYSTEM_PROCESSES = ^_SYSTEM_PROCESSES;
}

//

procedure TForm1.FormCreate(Sender: TObject);
begin
  StaticText1.Caption := InttoStr(sizeof(TMyString));
  StaticText2.Caption := InttoStr(sizeof(TMyStringV2));
  StaticText3.Caption := InttoStr(sizeof(TMyStringV2_01));
  StaticText4.Caption := InttoStr(sizeof(TMyStringV2_02));
  StaticText5.Caption := InttoStr(sizeof(TMyStringV2_03));
  StaticText6.Caption := InttoStr(sizeof(TMyStringV2_04));
  StaticText7.Caption := InttoStr(sizeof(TMyStringV2_05));
  StaticText8.Caption := InttoStr(sizeof(TMyStringV2_06));
end;

Keine Kommentare:

Kommentar veröffentlichen

Beliebte Posts

Translate