Имеется стуктура, переведённая с C++. Правильность перевода подтверждаю. В C++ используется #pragma pack(1), в дельфийском аналоге - packed record. То есть все мемберы идут впритык. Вот она:
- Код: Выделить всё
Type MODULE_DESCR_E440
TypeSize As Integer ' размер структуры
SerialNumber(0 To 8) As Byte ' серийный номер
ModuleName(0 To 6) As Byte ' название платы
Revision As Byte ' ревизия платы
Dsp_Type(0 To 4) As Byte ' тип установленного DSP
IsDacPresented As Byte ' флажок наличия ЦАП
QuartzFrequency As Long ' частота кварца в Гц
ReservedWord(0 To 12) As Byte ' зарезервировано
CalibrKoefAdc(0 To 7) As Integer ' корректировочные коэф. для АЦП
CalibrKoefDac(0 To 3) As Integer ' корректировочные коэф. для ЦАП
End Type
Спрашивается, какого ...
Так вот, какого... до QuartzFrequency всё впритык, а сам QuartzFrequency отстоит от предыдущего мембера на 3 выравнивающих байта?
Проблема-то в том, что структура определяется на VB, а указатель на неё идёт в апишку, которая эту ботву заполняет. Апишка-то заполняет всё впритык! А VB потом читает всякую ерунду, из-за сдвига в 3 байта. Приходится все нижеследующие мемберы получать через GetMem4.
Но это же криво! К тому же, как узнать, будет ли иметь место это выравнивание в каждом конкретном случае? Не проверять же каждую новую структуру помемберно.
Вот. Какие мысли будут?