Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> EVT_VARIANT, перевод Си структуры на Delphi 
V
    Опции темы
CynicRus
Дата 16.8.2015, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Приветствую уважаемых форумчан.
Имеется у мелкомягких следующая структура:
Код

typedef struct _EVT_VARIANT {
  union {
    BOOL       BooleanVal;
    INT8       SByteVal;
    INT16      Int16Val;
    INT32      Int32Val;
    INT64      Int64Val;
    UINT8      ByteVal;
    UINT16     UInt16Val;
    UINT32     UInt32Val;
    UINT64     UInt64Val;
    float      SingleVal;
    double     DoubleVal;
    ULONGLONG  FileTimeVal;
    SYSTEMTIME *SysTimeVal;
    GUID       *GuidVal;
    LPCWSTR    StringVal;
    LPCSTR     AnsiStringVal;
    PBYTE      BinaryVal;
    PSID       SidVal;
    size_t     SizeTVal;
    EVT_HANDLE EvtHandleVal;
    BOOL       *BooleanArr;
    INT8       *SByteArr;
    INT16      *Int16Arr;
    INT32      *Int32Arr;
    INT64      *Int64Arr;
    UINT8      *ByteArr;
    UINT16     *UInt16Arr;
    UINT32     *UInt32Arr;
    UINT64     *UInt64Arr;
    float      *SingleArr;
    double     *DoubleArr;
    FILETIME   *FileTimeArr;
    SYSTEMTIME *SysTimeArr;
    GUID       *GuidArr;
    LPWSTR     *StringArr;
    LPSTR      *AnsiStringArr;
    PSID       *SidArr;
    size_t     *SizeTArr;
    LPCWSTR    XmlVal;
    LPCWSTR*   XmlValArr;
  };
  DWORD Count;
  DWORD Type;
} EVT_VARIANT, *PEVT_VARIANT;

Пробую перевести её на Delphi так:
Код

TEvtVariant =  record
    Union:  record
    case dword of
      0: (BooleanVal: boolean);
      1: (SByteVal: Int8);
      2: (Int16Val: int16);
      3: (Int32Val: int32);
      4: (Int64Val: int64);
      5: (ByteVal: UInt8);
      6: (UInt16Val: UInt16);
      7: (UInt32Val: UInt32);
      8: (UInt64Val: UInt64);
      9: (SingleVal: single);
      10: (DoubleVal: double);
      11: (FileTimeVal: ULONGLONG);
      12: (SysTimeVal: SYSTEMTIME);
      13: (GuidVal: GUID);
      14: (StringVal: PWideChar);
      15: (AnsiStringVal: PChar);
      16: (BinaryVal: PByte);
      17: (SidVal: PSid);
      18: (SizeTVal: size_t);
      19: (EvtHandleVal: EVT_HANDLE);
      20: (BooleanArr: PBoolean);
      21: (SByteArr: PByte);
      22: (Int16Arr: ^int16);
      23: (Int32Arr: ^int32);
      24: (Int64Arr: ^int64);
      25: (ByteArr: PByte);
      26: (UInt16Arr: ^UInt16);
      27: (UInt32Arr: ^Uint32);
      28: (UInt64Arr: ^Uint64);
      29: (SingleArr: ^single);
      30: (DoubleArr: ^double);
      31: (FileTimeArr: ^FileTime);
      32: (SysTimeArr: ^SystemTime);
      33: (GuidArr: ^GUID);
      34: (StringArr: ^PWideChar);
      35: (AnsiStringArr: ^PChar);
      36: (SidArr: ^PSid);
      37: (SizeTArr: ^Size_T);
      38: (XmlVal: PwideChar);
      39: (XmlValArr: ^PWideChar);
      end;
    Count: Dword;
    vType: Dword;
  end;

И в результате - WinApi Функция её съедает, но на выходе - данные не валидны. В vType и Count рандомный мусор, при том что должно быть от 0 до 39. Следовательно я её перевёл не верно. Каким образом необходимо эту структуру перевести корректно? Я испробовал несколько вариантов - и не один не сработал-(
PM MAIL   Вверх
CynicRus
Дата 16.8.2015, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Ну вообщем, я слегка с размерами закосячил. Вот так всё работает как надо:
Код

 {$packrecords C}
  type TEvtVariant =  record
   Union:  record
    case dword of
      0: (BooleanVal: boolean);
      1: (SByteVal: Int8);
      2: (Int16Val: int16);
      3: (Int32Val: int32);
      4: (Int64Val: int64);
      5: (ByteVal: UInt8);
      6: (UInt16Val: UInt16);
      7: (UInt32Val: UInt32);
      8: (UInt64Val: UInt64);
      9: (SingleVal: single);
      10: (DoubleVal: double);
      11: (FileTimeVal: ULONGLONG);
      12: (SysTimeVal: ^SYSTEMTIME);
      13: (GuidVal: ^GUID);
      14: (StringVal: PWideChar);
      15: (AnsiStringVal: PChar);
      16: (BinaryVal: PByte);
      17: (SidVal: PSid);
      18: (SizeTVal: size_t);
      19: (EvtHandleVal: EVT_HANDLE);
      20: (BooleanArr: PBoolean);
      21: (SByteArr: PByte);
      22: (Int16Arr: ^int16);
      23: (Int32Arr: ^int32);
      24: (Int64Arr: ^int64);
      25: (ByteArr: PByte);
      26: (UInt16Arr: ^UInt16);
      27: (UInt32Arr: ^Uint32);
      28: (UInt64Arr: ^Uint64);
      29: (SingleArr: ^single);
      30: (DoubleArr: ^double);
      31: (FileTimeArr: ^FileTime);
      32: (SysTimeArr: ^SystemTime);
      33: (GuidArr: ^GUID);
      34: (StringArr: ^PWideChar);
      35: (AnsiStringArr: ^PChar);
      36: (SidArr: ^PSid);
      37: (SizeTArr: ^Size_T);
      38: (XmlVal: PwideChar);
      39: (XmlValArr: ^PWideChar);
      end;
    Count: Dword;
    vType: Dword;
  end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0750 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.