![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно записать Blob в TStream в UDF ?
Vorobyev Sergey © (2003-08-22 14:11:00)
У меня есть следующий код (немного переделанный, в исходном варианте результат записывался не в TStream, а в PChar)
procedure BlobAsStream(Blob:TBlob; Stream:TMemoryStream);
var bytes_left, total_bytes_read, bytes_read:integer;
st:string;
begin
if (not Assigned(Blob.Handle)) then exit;
with Blob do
begin
bytes_left := TotalLength; // I have TotalSize bytes to read.
if (bytes_left = 0) then exit; // if I"ve nothing to copy, exit.
SetString(st, nil, TotalLength);
total_bytes_read := 0; // total bytes read is 0.
repeat
// Using BlobHandle, store at most "bytes_left" bytes in
// the buffer starting where I last left off
GetSegment(Handle, @st[total_bytes_read + 1], bytes_left, bytes_read);
// Increment total_bytes_read by the number of bytes actually read.
Inc(total_bytes_read, bytes_read);
// Decrement bytes_left by the number of bytes actually read.
Dec(bytes_left, bytes_read);
until bytes_left <= 0;
end;
Stream.Write(st[1], Blob.TotalLength);
end;
В результате получается такая БЯКА..
В строковой переменнойstесть все данные до размера 16384, а дальше все нули.. Т.е. как будто бы все далее обрезается.. Почему?
Подскажите, пожалуйста..
Проверял под IB6, Yaffil.
Digitman (2003-08-22 14:43:00) [21]
а ты уверен, что содержимое блоба в действительности иное ? т.е. полный размер блоба, скажем, 16386 байт и два последних байта точно не равны нулю ? может ты блоб своими руками некорректно сформировал, а при его чтении ждешь "правильного" результата ?
Vorobyev Sergey (2003-08-22 14:37:00) [22]
> Digitman © (22.08.03 14:20) [1]
Проверил, все равно только первые 16384 байт берет, остальные обрезает..
Digitman (2003-08-22 14:20:00) [23]
PMemoryStream = ^TMemoryStream;
...
function BlobToMemStream(Blob: PBlob): PMemoryStream; cdecl; export;
.....
function InternalGetBlob(Blob: PBlob; Buffer: Pointer; Size: Integer): ULong;
var
BytesRead: Integer;
begin
Result:= 0;
if Assigned(Blob) then with Blob^ do
if Assigned(BlobHandle) and Assigned(GetSegment) then
while (Size > 0) and Boolean(GetSegment(BlobHandle, PChar(Buffer) + Result, Size, BytesRead)) do begin
Inc(Result, BytesRead);
Dec(Size, BytesRead);
end;
end;
function BlobToMemStream(Blob: PBlob): PMemoryStream;
var
tmp: TMemoryStream;
begin
Result:= nil;
if Assigned(Blob) then
with Blob^ do
try
if Assigned(BlobHandle) and Assigned(GetSegment) then begin
tmp:= TMemoryStream.Create;
try
tmp.Size:= TotalSize;
InternalGetBlob(Blob, tmp.Memory, TotalSize);
Result:= PMemoryStream(Blob);
Result^:= tmp;
AttachedThreads.RegisterObject(Result^);
except
tmp.Free;
raise;
end;
end else
Result:= nil;
except
Result:= nil;
end;
end;