Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизНеуловимый exception Найти похожие ветки
← →
Kotka © (2004-07-21 00:11) [0]Есть некая библиотека для сжатия данных. Для распаковки данных нужен такой код:
MyStream := TMemoryStream.Create;//обычный мемористрим
DCS:=TZDeCompressionStream.Create(mystream);//стрим из библиотеки
MyStream.Write(globinbuf, nowsize);//пишем в мемористрим распакуемые данные, которые находятся в globinbuf
i:=dcs.Size;//получаем размер распакованных данных
DCS.Read(globInBuf, i);//читаем распакованные данные уже из декомпрешн стрим
DCS.Free;//в комментариях не нуждается...
MyStream.Free;
Если данные повреждены, в строкеMyStream.Write(globinbuf, nowsize);
возникает эксепшн. Причем простымtry
MyStream.Write(globinbuf, nowsize);
except
end;
его не отловить! Просмотрев исходные коды библиотеки, видно, что эксепшн возникает в функцииfunction ZDecompressCheck(code: Integer): Integer;
begin
Result := code;
if code < 0 then
begin
raise EZDecompressionError.Create(_z_errmsg[2 - code]);//<--вот он, проказник!
end;
end;
Эта функция в свою очередь вызывается из функции Seek того самого декомпрешн стрим. Каким образом вызывается эта функция и как отловить эксепшн?
← →
Kotka © (2004-07-21 00:16) [1]Каким образом вызывается функция Seek и как отловить эксепшн?
← →
Digitman © (2004-07-21 08:38) [2]что-то ты наблудил в коде ... нонсенс в алгоритме ...
InStream := TMemoryStream.Create;
try
InStream.Write(globinbuf, nowsize);
InStream.Position := 0;
OutStream := TMemoryStream.Create;
try
DCS:=TZDeCompressionStream.Create(InStream);
try
try
OutStream.CopyFrom(DCS);
except
Showmessage("Исключение !");
raise;
end;
finally
DCS.Free;
end;
ShowMessage("Данные распакованы в OutStream, размер распакованых данных = " + IntToStr(OutStream.Size));
... используем распакованные данные прежде чем OutStream будет уничтожен
finally
OutStream.Free;
end;
finally
InStream.Free;
end;
DCS:=TZDeCompressionStream.Create(mystream);
try
MyStream.Write(globinbuf, nowsize);
i:=dcs.Size;
DCS.Read(globInBuf, i);
DCS.Free;//в комментариях не нуждается...
MyStream.Free;
Если данные повреждены
← →
Digitman © (2004-07-21 08:40) [3]p.s.
все что ниже
InStream.Free;
end;
не читать - это очепятка
← →
Kotka © (2004-07-21 15:01) [4]... и вместо OutStream.CopyFrom(DCS) читать OutStream.CopyFrom(DCS,DCS.Size) ;)
Спасибо, все работает.
← →
Digitman © (2004-07-21 15:09) [5]
> Kotka
ну да, разумеется, размер тоже нужен
p.s.
между прочим, пример использования поточных компрессоров/декомпрессоров есть в демо-каталоге в папке MIDAS\INTRCPT
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.041 c