Callback в x64

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
IvZel
незнакомец
Сообщения: 2
Зарегистрирован: 28.07.2009 03:38:02

Callback в x64

Сообщение IvZel »

При попытке перевода библиотеки UDF для Firebird с х32 на х64 столкнулся со следующей проблемой.
Имеется С тип (из ibase.h для Firebird):

Код: Выделить всё

typedef struct blobcallback {
    short (*blob_get_segment)
      (void* hnd, ISC_UCHAR* buffer, ISC_USHORT buf_size, ISC_USHORT* result_len);
    void*      blob_handle;
    ISC_LONG   blob_number_segments;
    ISC_LONG   blob_max_segment;
    ISC_LONG   blob_total_length;
    void (*blob_put_segment)
      (void* hnd, const ISC_UCHAR* buffer, ISC_USHORT buf_size);
    ISC_LONG (*blob_lseek)
      (void* hnd, ISC_USHORT mode, ISC_LONG offset);
}  *BLOBCALLBACK;

(на непонятные ISC_LONG, ISC_USHORT не обращайте внимания, это обычные числовые типы, объявленные особо ради кросс-платформенности).
На Паскаль он переведен следующим образом:

Код: Выделить всё

  TISC_BlobGetSegment = function(BlobHandle: PInt;
                                 Buffer: PChar;
                                 BufferSize: Long;
                                 var ResultLength: Long): Short; cdecl;
  TISC_BlobPutSegment = procedure(BlobHandle: PInt;
                                  Buffer: PChar;
                                  BufferLength: Short); cdecl;
  TBlob = record
    GetSegment         : TISC_BlobGetSegment;
    BlobHandle         : PInt;
    SegmentCount       : Long;
    MaxSegmentLength   : Long;
    TotalSize          : Long;
    PutSegment         : TISC_BlobPutSegment;
  end;
  PBlob = ^TBlob;

При попытке вызвать GetSegment или PutSegment (callback-и: передаются из сервера в мою функцию) происходит вылет. Главное, на х32 работает и паскалевский, и С-код. На х64 С-код работает, а код на FPC - нет. Проблема наблюдается и в Винде, и в Линуксе.
То, что С-код работает, показывает, что проблема не в Firebird, а в моей программе.
Пока все факты показывают, что проблема именно в компиляторе freepascal х64. Как-то он "неправильно", отличным от компилятора freepascal х32 и gcc способом, производит вызов этих callback-ов.

Кто что может посоветовать? Ну, или хотя бы, задать наводящие на решение вопросы?
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Проверьте размеры типов в x64. Процентов 80, что в FPC объявлены функции актуальные только для 32 разрядного режима!
Max Rusov
постоялец
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Сообщение Max Rusov »

Еще проверьте выравнивание структур. Для того, чтобы оно соответствовало C-шным модуль должен быть откомпилирован с опцией:

{$PACKRECORDS C}
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

IvZel писал(а):(на непонятные ISC_LONG, ISC_USHORT не обращайте внимания, это обычные числовые типы, объявленные особо ради кросс-платформенности).

Таки не очень понимаю, о чем можно говорить, не видя их объявления. Да и объявление Long для FPC не помешало бы...
IvZel
незнакомец
Сообщения: 2
Зарегистрирован: 28.07.2009 03:38:02

Сообщение IvZel »

Спасибо всем, особенно Max Rusov.
Заработало.
Ответить