Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Неуловимый 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.053 c
1-1089818625
DreymanD
2004-07-14 19:23
2004.08.01
Запаковка картинок, содержащихся в листе(TListBox)


1-1090259508
Sphinx
2004-07-19 21:51
2004.08.01
Основная форма программы


1-1090299020
999
2004-07-20 08:50
2004.08.01
progressbar.create


14-1089964754
}|{yk
2004-07-16 11:59
2004.08.01
До окончания кучмизма осталось меньше 120 дней


1-1090407209
safo
2004-07-21 14:53
2004.08.01
Редирект