Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно записать Blob в TStream в UDF ?


Страницы:   1 2

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо