德尔福 Xe4。有一组用于数据压缩的组件:ABBREVIA ( http://tpabbrevia.sourceforge.net ) 它实现了 LZMA 压缩,以及一个模块 AbLZMA.pas(Lzma 压缩/解压缩例程)。
用它 :
...
Uses ablzma;
...
procedure TForm1.Button1Click(Sender: TObject);
var f1,f2:tfilestream;
begin
f1:=tfilestream.Create('d:\1.test',fmOpenRead);
f2:=tfilestream.Create('d:\1.lzma',fmCreate);
LzmaEncodeStream(f1,f2,f1.Size);
f2.Free;
f1.Free;
end;
...
一切正常。
问题:
- 如何添加代码以显示百分比完成操作?
- 如何将代码添加到压缩过程的中止?
在模块 AbLZMA.pas(也尝试使用 AbLZMAStream.pas)中是主程序 LzmaEnc_Encode,它在调用 LzmaEncodeStream 时工作:
function LzmaEnc_Encode(p: CLzmaEncHandle; outStream: PISeqOutStream;
inStream: PISeqInStream; Progress: PICompressProgress;
Alloc, allocBig: PISzAlloc): SRes; cdecl; external;
它有一个参数“Progress: PICompressProgress;”,其中
ICompressProgress = packed record
Progress: function(p: Pointer; inSize, outSize: Int64): SRes; cdecl;
end;
PICompressProgress = ^ICompressProgress;
我尝试在模块 AbLZMA.pas 中添加一个过程:
function MyProgress(p: Pointer; inSize, outSize: Int64): SRes;cdecl;
begin
// what is "p"?
// form1.caption:=result //?
end;
...
procedure LzmaEncodeStream(ASourceStream, ATargetStream: TStream; ASourceSize: Int64);
var
...
PMyProgress:PICompressProgress;
begin
...
PMyProgress.Progress:=MyProgress;
...
LzmaCheck(LzmaEnc_Encode(LEncHandle, @LOutStreamRec.Intf, @LInStreamRec.Intf,
{nil}PMyProgress // this
,@DelphiMMInterface, @DelphiMMInterface));
...
end;
在这种情况下(即使程序的主体为空白),也会出现错误 AV。如何从当前完成百分比中获取数据?