Главная страница
    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.45 MB
Время: 0.037 c
10-1024547091
msts
2002-06-20 08:24
2004.08.01
IDL2PAS/IDL2JAVA наследование интерфейсов


14-1089984104
Undert
2004-07-16 17:21
2004.08.01
Убить DLL


3-1087821905
Bulgar
2004-06-21 16:45
2004.08.01
Альтернатива базе данных


14-1089280477
Layner
2004-07-08 13:54
2004.08.01
Грузия - Осетия...


1-1089974354
MMF
2004-07-16 14:39
2004.08.01
PowerPoint в TOleContainer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский