var
  FileName : string;
  ScrStream : TFileStream;  //   DestStream
  DestStream : TMemoryStream;
  Compress : TDecompressionStream;
  iCount: int64;
  Buffer : PChar;
begin
  if OpenDialog.Execute then
  begin
    FileName :=OpenDialog.FileName;
    ScrStream := TFileStream.Create(FileName,fmOpenRead);
    DestStream :=  TMemoryStream.Create;
    ScrStream.Position := 0;
    try      ScrStream.ReadBuffer(Buffer,iCount);
      GetMem(Buffer,iCount);      Compress := TDecompressionStream.Create(ScrStream);
      Compress.ReadBuffer(Buffer^,iCount);  ////在这就报错啊,怎么办,谁帮帮我啊      DestStream.WriteBuffer(Buffer^,iCount);
      DestStream.Position := 0;
     // if DestStream.Size > 0 then
      //DestStream.SaveToFile('test.exe');    finally
      ScrStream.Free;
      DestStream.Free;
    end;
  end;

解决方案 »

  1.   

    //下面的语句是不是有错?
          ScrStream.ReadBuffer(Buffer,iCount); 
          GetMem(Buffer,iCount);
    //改成如下:
    iCount := ScrStream.Size + 1;
    GetMem(Buffer,iCount);
    ScrStream.ReadBuffer(Buffer,iCount); 
      

  2.   

    procedure TFilePacket.PackStream(var Stream: OleVariant);
    var
      ZStream: TCompressionStream;
      InStream:TMemoryStream;
      TempStream:TMemoryStream;
      BStream:TMemoryStream;
      Param:OleVariant;
      p:Pointer;
      pi:Pointer;
      pj:Pointer;
      bSize:int64;
    begin
      InStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      TempStream:=TMemoryStream.Create;
      pi:=VarArrayLock(Stream);
      try
         TempStream.Write(pi^,VarArrayHighBound(Stream,1)+1);
         ZStream:=TCompressionStream.Create(cldefault, InStream);
         try
            ZStream.CopyFrom(TempStream,0);
         finally
            ZStream.Free;
         end;
         Param:=VarArrayCreate([0,InStream.Size-1+sizeof(bSize)],varByte);
         p:=VarArrayLock(Param);
         try
            pj:=Addr(bSize);
            bSize:=TempStream.Size;
            BStream.Write(pj^,sizeof(bSize));
            BStream.Position:=sizeof(bSize);
            InStream.Position:=0;
            BStream.CopyFrom(InStream,InStream.Size);
            bstream.Position:=0;
            BStream.Read(p^,BStream.Size);
         finally
            VarArrayUnlock(Param);
         end;
      finally
         VarArrayUnlock(Stream);
         InStream.Free;
         TempStream.Free;
         BStream.Free;
      end;
      Stream:=Param;
    end;
    procedure TFilePacket.UnPackStream(var Stream: OleVariant);
    var
      TempStream:TMemoryStream;
      OutStream:TMemoryStream;
      ZStream: TDecompressionStream;
      BStream:TMemoryStream;
      Param:OleVariant;
      p:Pointer;
      po:Pointer;
      bSize:int64;
      pj:Pointer;
    begin
      TempStream:=TMemoryStream.Create;
      BStream:=TMemoryStream.Create;
      OutStream:=TMemoryStream.Create;
      p:=VarArrayLock(Stream);
      try
         TempStream.Write(p^,VarArrayHighBound(Stream,1)+1);
         pj:=Addr(bSize);
         TempStream.Position:=0;
         TempStream.Read(pj^,sizeof(bSize));
         TempStream.Position:=sizeof(bSize);
         if TempStream.Size>0 then BStream.CopyFrom(TempStream,TempStream.Size-sizeof(bSize));
         BStream.Position:=0;
         ZStream:=TDecompressionStream.Create(BStream);
         zstream.Position:=0;
         try
            OutStream.CopyFrom(ZStream,bSize);
            Param:=VarArrayCreate([0,OutStream.Size-1],varByte);
            po:=VarArrayLock(Param);
            try
               OutStream.Position:=0;
               OutStream.Read(po^,OutStream.Size);
            finally
               VarArrayUnlock(Param);
            end;
         finally
            ZStream.Free;
         end;
      finally
         VarArrayUnlock(Stream);
         BStream.Free;
         OutStream.Free;
         TempStream.Free;
      end;
      Stream:=Param;
    end;
      

  3.   

    我的代码只是给你参考,单看你的解压代码是没有用的,需要看你是如何压缩的,即所谓的怎么存就怎么取,当然,在Zlib压缩时有一个麻烦事就是在保存压缩流时还须存入未压缩时的长度。