Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.46 MB
Время: 0.038 c
4-1087542518
Тимохов
2004-06-18 11:08
2004.08.01
CreateRemoteThread


3-1089115289
Valeri
2004-07-06 16:01
2004.08.01
Дата + время


1-1090162576
qwe
2004-07-18 18:56
2004.08.01
как создать и работать с упаковаными данными


6-1085983190
it-doctor
2004-05-31 09:59
2004.08.01
Как включить и выключить компьютер по сети?


1-1090398084
Loeron
2004-07-21 12:21
2004.08.01
TDriverComboBox &amp; TDirectoryListBox





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский