powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / udf 32->64
11 сообщений из 36, страница 2 из 2
udf 32->64
    #39549064
Фотография konstsch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
while затер сорри
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    try
        while StreamSize <> 0 do begin
          if StreamSize > BufSize then ReadLength := BufSize else ReadLength := StreamSize;
          Stream.ReadBuffer(Buffer^, ReadLength);
          with oBLOb do PutSegment(Handle, Buffer, ReadLength);   /// здесь вылетает
          Dec(StreamSize, ReadLength);
        end;
    finally
        FreeMem(Buffer, BufSize);
    end; 
...
Рейтинг: 0 / 0
udf 32->64
    #39549106
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstsch, для началу, у тебя неверная структура TBLOB.
Вот моя (она работает и на 32 и на 64 в FPC):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
TISC_BlobGetSegment = function(BlobHandle: PInt;
                                 Buffer: PAnsiChar;
                                 BufferSize: LongInt;
                                 var ResultLength: LongInt): Short; cdecl;
  TISC_BlobPutSegment = procedure(BlobHandle: PInt;
                                  Buffer: PAnsiChar;
                                  BufferLength: Short); cdecl;
  TBlob = record
    GetSegment         : TISC_BlobGetSegment;
    BlobHandle         : PInt;
    SegmentCount       : LongInt;
    MaxSegmentLength   : LongInt;
    TotalSize          : LongInt;
    PutSegment         : TISC_BlobPutSegment;
  end;


В BlobGetSegment 3-й параметр у тебя Word, а нужен LongInt. Дальше не смотрел - это уже полный крах. Как у тебя раньше могло что-то работать - не представляю. Случайно везло.
...
Рейтинг: 0 / 0
udf 32->64
    #39549121
Фотография konstsch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а short и pint у вас что
...
Рейтинг: 0 / 0
udf 32->64
    #39549124
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockВ BlobGetSegment 3-й параметр у тебя Word, а нужен LongInt.

Оригинал с тобой не согласен:
Код: plaintext
1.
2.
    short (*blob_get_segment)
		(void* hnd, ISC_UCHAR* buffer, ==>ISC_USHORT buf_size,<== ISC_USHORT* result_len);


Но из-за округления параметров в стеке до int это не влияет на результат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
udf 32->64
    #39549178
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstschа short и pint у вас что

Pint = Pointer
Short = Smallint

Dimitry Sibiryakov,

а, так это у меня случайно работало)
...
Рейтинг: 0 / 0
udf 32->64
    #39549196
Фотография konstsch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
PutSegment(Handle, Buffer, ReadLength);


что угодно туда клади все равно то же самое
...
Рейтинг: 0 / 0
udf 32->64
    #39549201
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstsch,

Так, на всякий. У тебя в udf присваивается где-то IsMultiThread := True?
...
Рейтинг: 0 / 0
udf 32->64
    #39549207
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konstschи буфер не пустой
и длинна есть но вылетает с ошибкой

А чему в это время равно oBlob вообще и PutSegment в частности?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
udf 32->64
    #39549220
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, проверяй:
для 32 бит: размер структуры TBlob должен быть 28 байт, смещение PutSegment - 20.
для 64 бит: размер 48 байт, смещение 32.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
udf 32->64
    #39549221
NickDee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорей всего выравнивания полей не те. В старых Delphi оно вроде 4, а в новых 8. В FPC вроде тоже 4. Для X64 нужно 8.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
  TISC_BlobGetSegment = function(BlobHandle: Pointer;
                                 Buffer: PAnsiChar;
                                 BufferSize: Word;
                                 ResultLength: PWord): Word; cdecl;

  TISC_BlobPutSegment = procedure(BlobHandle: Pointer;
                                  Buffer: PAnsiChar;
                                  BufferLength: Word); cdecl;

  TISC_BlobSeek = function(BlobHandle: Pointer;
                                  Mode: Word; // blb_seek_relative: Word = 1; blb_seek_from_tail: Word = 2;
                                  Offset: Integer): Integer; cdecl;

{$IFDEF CPUX86}
{$A4}
{$ENDIF}

{$IFDEF CPUX64}
{$A8}
{$ENDIF}
  TBlobCallback = record
    GetSegment         : TISC_BlobGetSegment;
    BlobHandle         : Pointer;
    SegmentCount       : Integer;
    MaxSegmentLength   : Integer;
    TotalSize          : Integer;
    PutSegment         : TISC_BlobPutSegment;
    Seek               : TISC_BlobSeek;
  end;
  PBlobCallback = ^TBlobCallback;

{$A8}
...
Рейтинг: 0 / 0
udf 32->64
    #39549223
Фотография konstsch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем огромное спасибо!!!!

Особенно NickDee .

Никогда с этим не сталкивался:
Код: pascal
1.
2.
3.
{$IFDEF CPUX64}
{$A8}
{$ENDIF}
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / udf 32->64
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]