C для преобразования Delphi - PullRequest
1 голос
/ 31 июля 2010

может кто-нибудь сказать мне, где я делаю ошибку в конвертации:

C

typedef struct _REGISTRY_EVENT {
    REG_NOTIFY_CLASS eventType;
    TIME_FIELDS time;
    HANDLE processId;
    ULONG dataType;
    ULONG dataLengthB;
    ULONG registryPathLengthB;
    /* Contains path and optionally data */
    UCHAR registryData[];
} REGISTRY_EVENT, * PREGISTRY_EVENT;

Delphi:

_Registry_Event = record
    EventType: REG_NOTIFY_CLASS;
    Time: TIME_FIELDS;
    processID: THandle;
    DataType: ULONG;
    DataLength: ULONG;
    registryPathLength: ULONG;
    registryData: array of UCHAR;
end;

из размера кода c (REGISTRY_EVENT) = 36

из размера кода delphi (REGISTRY_EVENT) = 40

Заранее спасибо

Боян

Ответы [ 4 ]

7 голосов
/ 31 июля 2010

Ошибка здесь

registryData: array of UCHAR;

Здесь вам не нужен динамический массив.


Обновлен:

Я предполагаю, что

UCHAR registryData[];

- это хак C для создания поля нулевой длины в конце структуры. Эквивалентный взлом Delphi -

registryData: record end;

чтобы получить доступ к этому фиктивному полю как к массиву в Delphi, вы должны набрать:

type
  PByteArr = ^TByteArr;
  TByteArr = array[0..$FFFF] of Byte;

  PRec = ^TRec;
  TRec = packed record
    Data: Integer;
    MoreData: record end;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  P: PRec;
  PMoreData: PByteArr;

begin
  P:= AllocMem(SizeOf(TRec) + 4);
  PMoreData:= @P^.MoreData;
  PMoreData^[2]:= 3;
  ShowMessage(IntToStr(PMoreData^[2]));
  FreeMem(P);
end;

но, вероятно, вам нужно типизировать это фиктивное поле к чему-то другому, поскольку определение поля - просто взлом.

И наконец: Никогда не используйте динамические массивы Delphi (например, registryData: массив UCHAR;) при преобразовании структур C в Delphi . Динамический массив в Delphi - это управляемый на протяжении жизни ссылочный тип, который не имеет точного эквивалента в C.

2 голосов
/ 31 июля 2010

Я не уверен, что это ошибка - это может быть компилятор, вставляющий некоторые поля между полями.Попробуйте добавить {$Align off} перед определением записи или измените = Record на = Packed Record и посмотрите, поможет ли это.

Редактировать: хотя это также может быть проблемой, ответ @ Serg мне кажется гораздо болеевероятно.

1 голос
/ 01 августа 2010
UCHAR registryData[];

есть

registryData: array[0..0] of UCHAR;

С упакованными записями и упакованным массивом для типов размер _Registry_Event равен 34.

0 голосов
/ 31 июля 2010

Вероятно, это связано либо с различными размерами типов данных каждого поля, либо из-за разного заполнения. Для размеров полей выведите sizeof () или size () для каждого и сравните. Если они все одинаковые, то это отступы, и вам может потребоваться найти опцию компилятора, чтобы настроить это.

То есть, если тебе не все равно. Почему вы заботитесь, если размеры одинаковы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...