Callback в x64

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

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

Callback в x64

Сообщение IvZel » 28.07.2009 04:33:52

При попытке перевода библиотеки 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-ов.

Кто что может посоветовать? Ну, или хотя бы, задать наводящие на решение вопросы?
IvZel
незнакомец
 
Сообщения: 2
Зарегистрирован: 28.07.2009 03:38:02

Re: Callback в x64

Сообщение Mr.Smart » 28.07.2009 08:11:11

Проверьте размеры типов в x64. Процентов 80, что в FPC объявлены функции актуальные только для 32 разрядного режима!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Callback в x64

Сообщение Max Rusov » 28.07.2009 10:32:24

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

{$PACKRECORDS C}
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Callback в x64

Сообщение Иван Шихалев » 02.08.2009 00:13:42

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

Таки не очень понимаю, о чем можно говорить, не видя их объявления. Да и объявление Long для FPC не помешало бы...
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

Re: Callback в x64

Сообщение IvZel » 02.08.2009 02:12:35

Спасибо всем, особенно Max Rusov.
Заработало.
IvZel
незнакомец
 
Сообщения: 2
Зарегистрирован: 28.07.2009 03:38:02


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru