Столкнулся со странной проблемой: при попытке прочитать содержимое BLOB в собственной UDF функции получаю только 2^14 байт правильно, вместо остальных получаю нули. Если размер BLOB меньше 2^14, то всё нормально.
Может быть кто-нибудь подскажет в чем может быть проблема.
Заранее благодарю.
P.s. Используется Firebird 1.5.3, пример написания BLOB UDF взят с этого сайта
BLOB и UDF
Модератор: kdv
Пример написания BLOB UDF взят из статьи "Как научиться писать UDF для InterBase за 21 мин.""функция с сайта" - это что конкретно?
Хотя нет, подзабыл я.
Лучше я приведу фрагмент исходного кода который присутствует у меня
Код: Выделить всё
// Это вспомагательная функция
procedure BlobAsBuffer(Blob: PBlob; var Buffer: PChar; var BufferLength: Integer); cdecl;
var
bytes_read, bytes_left, total_bytes_read: Integer;
begin
with Blob^ do
begin
Buffer:=SysGetMem(TotalSize);
total_bytes_read:=0;
bytes_left:=TotalSize;
BufferLength:=TotalSize;
if (bytes_left = 0) then exit;
repeat
GetSegment(BlobHandle, @Buffer[total_bytes_read], bytes_left, bytes_read);
Inc(total_bytes_read, bytes_read);
Dec(bytes_left, bytes_read);
until bytes_left <= 0;
end;
end;
// Это главная функция
procedure MyFunction(InBlob, OutBlob: PBlob); cdecl; export;
var
InBuffer: PChar;
begin
OutBuffer:=nil;
if (not Assigned(InBlob)) or
(not Assigned(InBlob^.BlobHandle)) or
(InBlob^.TotalSize=0) then exit;
BlobAsBuffer(InBlob, InBuffer, InBufferLength);
// В этом месте содержимое InBuffer содержит только 2^14
// правильных байт, остальная часть буфера содержит нули
Ошибка мною найдена.
В используемом у меня модуле ib_externals было некорректное описание
функции GetSegment, а именно типов параметров BufferSize и ResultLength.
Если я бы был внимательнее, то наверно обратил бы внимание на это
В используемом у меня модуле ib_externals было некорректное описание
функции GetSegment, а именно типов параметров BufferSize и ResultLength.
Если я бы был внимательнее, то наверно обратил бы внимание на это
freeudflib.zip (176K), 05.06.2001, Greg Deatz & C. Valderrama.
by KDV - 05.06.2003 исправлены декларация getsegment, функции