![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неуловимый 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 и как отловить эксепшн?