var
FS:TfileStream;
tempstream:tmemorystream;
buffer:array of byte;
begin FS:=tfilestream.Create('123.tmp',fmOpenReadWrite or  fmShareDenyNone); tempstream:=tmemorystream.Create;
 
fs.Position:=0;
 
tempstream.CopyFrom(fs,0);//把123.tmp全部拷贝到内存流
 
setlength(buffer,2048);
 
ZDecompress(tempstream,1024,pointer(buffer),2048);// 1024 2048指大小,假设123.tmp压缩前是2048 压缩后是1024,调用 ZDecompress解压缩
 
tempstream.write(buffer,2048) ;//解压缩后的数据流存入tempstream。。
这里是zlib的ZDecompress原型
procedure ZDecompress(const inBuffer: Pointer; inSize: Integer;
 out outBuffer: Pointer; out outSize: Integer; outEstimate: Integer = 0);我想利用zlib的ZDecompress把123.tmp进行解压然后保存解压后的文件,关键是这个ZDecompress不知道怎么用,我上面的代码肯定是错的,请问该怎么修改啊,最近被指针搞得要死,谢谢大家

解决方案 »

  1.   

    {-------------------------------------------------------------------------------
     单元名: uZlibClass.pas
     功能  : 简单压缩 -- Zlib
     作者  : Duo
     日期  :2010-04-28 22:04:09
     说明  :压缩解压 流,文件
    -------------------------------------------------------------------------------}
    unit uZlibClass;interfaceuses Windows,SysUtils,Classes,ZLib,Forms;type
      TZlibOnProgressEvent = procedure (AFileSize,AFilePos:Int64) of object;
      TZlibClass=class
      private
        FFilePos: Int64;
        FFileSize: Int64;
        FOnProgress: TZlibOnProgressEvent;
        procedure CsProgress(Sender:TObject); // 压缩
        procedure DsProgress(Sender:TObject); // 解压
      public
        procedure CompressionStream(ASourceStream,ATargetStream:TMemoryStream);
        procedure DecompressionStream(ASourceStream,ATargetStream:TMemoryStream);
        procedure CompressionFile(const ASourceFile,ATargetFile:TFileName);
        procedure DecompressionFile(const ASourceFile,ATargetFile:TFileName);
        property FileSize:Int64 read FFileSize;
        property FilePos:Int64 read FFilePos;
        property OnProgress:TZlibOnProgressEvent read FOnProgress write FOnProgress;
      end;implementation{ TZlibClass }procedure TZlibClass.CompressionFile(const ASourceFile, ATargetFile: TFileName);
    var fs,ms:TMemoryStream;
    begin
      fs:=TMemoryStream.Create;
      ms:=TMemoryStream.Create;
      try
        fs.LoadFromFile(ASourceFile);
        CompressionStream(fs,ms);
        ms.SaveToFile(ATargetFile);
      finally
        FreeAndNil(ms);
        FreeAndNil(fs);
      end;
    end;procedure TZlibClass.CompressionStream(ASourceStream,ATargetStream:TMemoryStream);
    var cs:TCompressionStream;
    begin
      FFileSize:=ASourceStream.Size;
      ATargetStream.Write(FFileSize,SizeOf(FFileSize));
      cs:=TCompressionStream.Create(clMax,ATargetStream);
      try
        cs.OnProgress := CsProgress;
        ASourceStream.SaveToStream(cs);
      finally
        FreeAndNil(cs);
      end;
    end;procedure TZlibClass.CsProgress(Sender: TObject);
    begin
      FFilePos:=TCompressionStream(Sender).Position;
      if Assigned(FOnProgress) then FOnProgress(FFileSize,FFilePos);
      Application.ProcessMessages;
    end;procedure TZlibClass.DecompressionFile(const ASourceFile,
      ATargetFile: TFileName);
    var fs,ms:TMemoryStream;
    begin
      fs:=TMemoryStream.Create;
      ms:=TMemoryStream.Create;
      try
        fs.LoadFromFile(ASourceFile);
        DecompressionStream(fs,ms);
        ms.SaveToFile(ATargetFile);
      finally
        FreeAndNil(ms);
        FreeAndNil(fs);
      end;
    end;procedure TZlibClass.DecompressionStream(ASourceStream,ATargetStream:TMemoryStream);
    var ds:TDecompressionStream;
    begin
      ASourceStream.Position:=0;
      ASourceStream.ReadBuffer(FFileSize,SizeOf(FFileSize));
      ATargetStream.SetSize(FFileSize);
      ds:=TDecompressionStream.Create(ASourceStream);
      try
        ds.OnProgress:=DsProgress;
        ds.Read(ATargetStream.Memory^,FFileSize);
      finally
        FreeAndNil(ds);
      end;
    end;procedure TZlibClass.DsProgress(Sender: TObject);
    begin
      FFilePos:=TDecompressionStream(Sender).Position;
      if Assigned(FOnProgress) then FOnProgress(FFileSize,FFilePos);
      Application.ProcessMessages;
    end;end.
      

  2.   

    ZDecompress(tempstream.memory,1024,pointer(buffer),2048);
      

  3.   

    还有
    tempstream.write(buffer[0],2048);
      

  4.   


    请问我想调用动态库,C++ 的 函数里有个参数是指针形的。我在delphi里怎么用啊?