Имеется С тип (из 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-ов.
Кто что может посоветовать? Ну, или хотя бы, задать наводящие на решение вопросы?