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

Вниз

Zlib потоки (TDecompressionStream)   Найти похожие ветки 

 
TCrash   (2006-12-27 10:05) [0]

Доброе время суток.
Возникла проблема с библиотекой Zlib.

type
 TScreenShot=class
   BitMap: TBitMap;
   DC: HDC;
   Bits: TPixelFormat;
   constructor Create;
   destructor Destroy; override;
   procedure Get;
   procedure PackToFile(const FName: string);
   procedure PackToStream(Dest: TStream);
   procedure UnPackFromFile(const FName: string);
   procedure UnPackFromStream(Src: TStream);
 end;

***** SKIPED *****

procedure TScreenShot.PackToFile(const FName: string);
var
 zStream: TCompressionStream;
 Src, Dest: TStream;
 pFN: PCHAR; fH: THandle;
begin
 pFN:=PCHAR(fName);
 fH:=CreateFile(pFN,GENERIC_WRITE,FILE_SHARE_WRITE,nil,CREATE_ALWAYS,FILE_ATTRIBU TE_ARCHIVE,0);
 CloseHandle(fH);
 Dest:=TFileStream.Create(FName,fmOpenWrite);
 Src:=TMemoryStream.Create;
 zStream:=TCompressionStream.Create(clMax,Dest);
 BitMap.SaveToStream(Src);
 zStream.CopyFrom(Src,0);
 zStream.Free;
 Src.Destroy;
 Dest.Free;
end;

procedure TScreenShot.UnPackFromFile(const FName: string);
var
 zStream: TDecompressionStream;
 Src, Dest: TStream;
begin
 Src:=TFileStream.Create(FName,fmOpenRead);
 Dest:=TMemoryStream.Create;
 if Src.Size>0 then begin
   zStream:=TDecompressionStream.Create(Src);
   zStream.CopyFrom(Src,0);
   BitMap.LoadFromStream(zStream);
 end;
 zStream.Free;
 Src.Destroy;
end;


На выделеной строке вываливается Run Time error "EDecompressionError with message "Invalid stream operations"
Код писан по образу и подобию с примера из DRKB v2.3 Может кто ткнет меня пальцем где я ошибся.
PS: открываемый файл существует, не заблокирован и создан при помоши процедуры PackToFile.


 
umbra ©   (2006-12-27 10:20) [1]

Writing to the stream will raise an exception

(C) VCL Help


 
MBo ©   (2006-12-27 10:26) [2]

Перед выделенной строчкой не нужно    zStream.Position обнулить?


 
TCrash   (2006-12-27 11:32) [3]

Обнуление не помогает.
>Umba
Я так понисаю имеется в виду строка zStream.CopyFrom(Src,0); ?
Если да, то как обойтись без нее?


 
umbra ©   (2006-12-27 11:44) [4]

насколько я понимаю, ее надо просто убрать.


 
TCrash   (2006-12-27 15:22) [5]

Перепробовал вроде бы уже все :( и ни чего не добился. Решил переделать с потоков на процедуру DecompressBuf. Вот код

procedure TScreenShot.UnPackFromStream(Src: TStream);
var
 tmpStream: TStream;
 inSize,outSize: integer;
 inBuf,outBuf: pointer;
begin
 if Src.Size>=0 then Src.Read(outSize,4);
 if outSize>0 then begin
   GetMem(outBuf,outSize);
   inSize:=Src.Size-3;
   GetMem(inBuf,inSize);
   Src.Read(inBuf,inSize);
   DecompressBuf(inBuf,inSize,outSize,outBuf,outSize);
   tmpStream:=TMemoryStream.Create;
   tmpStream.Write(outBuf,outSize);
   BitMap.LoadFromStream(tmpStream);
   FreeMem(inBuf);
   FreeMem(outBuf);
   tmpStream.Free;
 end;
end;


Опять вылетает EDecompressionError :(


 
umbra ©   (2006-12-27 16:10) [6]


> ешил переделать с потоков на процедуру DecompressBuf

а что за процедура?


 
ORMADA ©   (2006-12-28 07:06) [7]

держи

procedure PackStream(var OutMemoryStream: TMemoryStream);
var
 UnknownPtr: pointer;
 NewSize: integer;
begin
 OutMemoryStream.Position := 0;
 try
   CompressBuf(OutMemoryStream.Memory, OutMemoryStream.Size, UnknownPtr, NewSize);
   OutMemoryStream.Clear;
   OutMemoryStream.Write(UnknownPtr^, NewSize);
   OutMemoryStream.Position := 0;
 finally
   FreeMem(UnknownPtr, NewSize);
 end;
end;

procedure UnPackStream(var sSrc: TMemoryStream);
var
 UnknownPtr: pointer;
 NewSize: integer;
begin
 sSrc.Position := 0;
 try
   DeCompressBuf(sSrc.Memory, sSrc.Size, 0, UnknownPtr, NewSize);
   sSrc.clear;
   sSrc.Position := 0;
   sSrc.Write(UnknownPtr^, NewSize);
   sSrc.Position := 0;
 finally
   FreeMem(UnknownPtr, NewSize);
 end;
end;


 
TCrash   (2007-01-03 13:10) [8]

>ORMADA ©   (28.12.06 07:06) [7]
Спасибо заработало. И свою ошибку понял :)


 
Ским   (2007-01-08 02:53) [9]

А вот я уже 8 день бьюсь со злибом, и у меня не работает. при компиляции вот этого кода:

procedure UnPackStream(var sSrc: TMemoryStream);
var
UnknownPtr: pointer;
NewSize: integer;
begin
sSrc.Position := 0;
try
  DeCompressBuf(sSrc.Memory, sSrc.Size, 0, UnknownPtr, NewSize);
  sSrc.clear;
  sSrc.Position := 0;
  sSrc.Write(UnknownPtr^, NewSize);
  sSrc.Position := 0;
finally
  FreeMem(UnknownPtr, NewSize);
end;
end;

Выдает подряд три ошибки: "error", access voilation, и под конец "Invalid stream operations". Я в шоке. Что делать?
P.S. в качестве sSrc передаю переменную input:


input:=tmemorystream.create;
input.Clear;
input.LoadFromFile("c:\file.gz");
UnPackStream(input);


Файл опять-таки существует, к нему есть доступ и т.п. (П.П.С. гзип и винрар его спокойн расшифровывают и шифруют обратно).


 
Anatoly Podgoretsky ©   (2007-01-08 02:56) [10]

> Ским  (08.01.2007 02:53:09)  [9]

Ну еще бы, освобождаешь не выделеную память и пытаешься работать с неинициализированым указателем.


 
Ским ©   (2007-01-08 02:59) [11]

О_о

1) вываливается во время обработки кода, который указан чуть выше моего первого сообщения (который у другого человкеа работает).

2) ладно, уберем .clear - реультат тот же... а указатель



Страницы: 1 вся ветка

Текущий архив: 2007.02.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
15-1170430896
Чапаев
2007-02-02 18:41
2007.02.25
Delphi+Translation Manager+Unicode


2-1170877230
Vemer
2007-02-07 22:40
2007.02.25
Как сменить цвет фонта у контрола?


3-1165211588
Yaros-hoi
2006-12-04 08:53
2007.02.25
Подключение к mdb через ADO на удаленной машине


4-1160804337
dreamse
2006-10-14 09:38
2007.02.25
SafeMode


15-1170412945
boriskb
2007-02-02 13:42
2007.02.25
Просто бизнес. Ничего личного.