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

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

Неуловимый exception [D6, WinXP]


Kotka ©   (2004-07-21 00:11:00) 

Есть некая библиотека для сжатия данных. Для распаковки данных нужен такой код:
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 того самого декомпрешн стрим. Каким образом вызывается эта функция и как отловить эксепшн?


Digitman   (2004-07-21 15:09:00) [1]


> Kotka


ну да, разумеется, размер тоже нужен

p.s.

между прочим, пример использования поточных компрессоров/декомпрессоров есть в демо-каталоге в папке MIDAS\INTRCPT


Kotka   (2004-07-21 15:01:00) [2]

... и вместо OutStream.CopyFrom(DCS) читать OutStream.CopyFrom(DCS,DCS.Size) ;)

Спасибо, все работает.


Digitman   (2004-07-21 08:40:00) [3]

p.s.
все что ниже

InStream.Free;
end;
не читать - это очепятка


Digitman   (2004-07-21 08:38:00) [4]

что-то ты наблудил в коде ... нонсенс в алгоритме ...

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;
Если данные повреждены


Kotka   (2004-07-21 00:16:00) [5]

Каким образом вызывается функция Seek и как отловить эксепшн?


Наверх

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