Inno setup Inno设置-如何添加多个arc文件进行解压缩?

Inno setup Inno设置-如何添加多个arc文件进行解压缩?,inno-setup,compression,Inno Setup,Compression,我使用以下代码:(Martin Prikryl的回答)使用Inno设置解压arc文件 我想有可能解压缩多个arc文件,以安装来自组件选择的文件(例如)。但仍然显示在所有提取的总体进度栏上。这一切可能吗?这是对我的答案的修改 先决条件相同,请参考其他答案 在ExtractArc中,为要提取的每个存档调用AddArchive [文件] 资料来源:unarc.dll;标志:dontcopy [守则] 常数 ArcCancelCode=-10; 函数自由弧提取( 回调:长词; Cmd1、Cmd2、Cm

我使用以下代码:(Martin Prikryl的回答)使用Inno设置解压arc文件


我想有可能解压缩多个arc文件,以安装来自组件选择的文件(例如)。但仍然显示在所有提取的总体进度栏上。这一切可能吗?

这是对我的答案的修改

先决条件相同,请参考其他答案

ExtractArc
中,为要提取的每个存档调用
AddArchive


[文件]
资料来源:unarc.dll;标志:dontcopy
[守则]
常数
ArcCancelCode=-10;
函数自由弧提取(
回调:长词;
Cmd1、Cmd2、Cmd3、Cmd4、Cmd5、Cmd6、Cmd7、Cmd8、Cmd9、Cmd10:PAnsiChar):整数;
外部的FreeArcExtract@files:unarc.dll cdecl';
常数
CP_UTF8=65001;
函数宽图表多字节(代码页:UINT;dwFlags:DWORD;
lpWideCharStr:string;cchWideChar:Integer;lpMultiByteStr:AnsiString;
cchMultiByte:整数;lpDefaultCharFake:整数;
lpUsedDefaultCharFake:Integer):整数;
外部的WideCharToMultiByte@kernel32.dllstdcall';
函数GetStringAsUtf8(S:string):AnsiString;
变量
Len:整数;
开始
Len:=宽图表多字节(CP_UTF8,0,S,长度,结果,0,0,0);
设置长度(结果,Len);
宽图表多字节(CP_UTF8,0,S,长度,结果,Len,0,0);
结束;
变量
ArcTotalSize:整数;
ArcTotalExtracted:整数;
arc:整数;
arcancel:布尔型;
ArcProgressPage:TOutputProgressWizardPage;
函数FreeArcCallback(
AWhat:PAnsiChar;Int1,Int2:Integer;Str:PAnsiChar):Integer;
变量
什么:字符串;
开始
什么:=什么;
如果What='origsize'那么
开始
日志(格式(“添加总大小为%d MB的文件的存档,[Int1]);
ArcTotalSize:=ArcTotalSize+Int1;
结束
其他的
如果What='write'那么
开始
如果ArcTotalSize>0,则
开始
ArcProgressPage.SetProgress(ArcTotalExtracted+Int1,ArcTotalSize);
结束;
ArcExtracted:=Int1;
结束
其他的
开始
{只是为了更频繁地使用消息队列(特别是对于“读取”回调),}
{要获得更平滑的进度条}
如果(ArcExtracted>0)和(ArcTotalSize>0),则
开始
ArcProgressPage.SetProgress(ArcTotalExtracted+ArcExtracted,ArcTotalSize);
结束;
结束;
如果为ArcCancel,则结果:=ArcCancelCode
其他结果:=0;
结束;
程序freearcmd(
Cmd1、Cmd2、Cmd3、Cmd4、Cmd5、Cmd6、Cmd7、Cmd8、Cmd9、Cmd10:字符串);
变量
arcsult:整数;
开始
ArcCancel:=假;
结果:=
游离提取物(
CreateCallback(@freeArcallback),
GetStringAsUtf8(Cmd1)、GetStringAsUtf8(Cmd2)、GetStringAsUtf8(Cmd3),
GetStringAsUtf8(Cmd4)、GetStringAsUtf8(Cmd5)、GetStringAsUtf8(Cmd6),
GetStringAsUtf8(Cmd7)、GetStringAsUtf8(Cmd8)、GetStringAsUtf8(Cmd9),
GetStringAsUtf8(Cmd10));
如果取消,那么
开始
RaiseException(“提取已取消”);
结束
其他的
如果结果为0,则
开始
RaiseException(格式('提取失败,代码为%d',[ArcResult]);
结束;
结束;
变量
ArcArchives:字符串数组;
过程AddArchive(ArchivePath:string);
开始
SetArrayLength(ArcArchives,GetArrayLength(ArcArchives)+1);
ArcArchives[GetArrayLength(ArcArchives)-1]:=ArchivePath;
FreeArcCmd('l','--',ArchivePath,','','','','','');
结束;
过程文件(DestPath:string);
变量
I:整数;
归档路径:字符串;
开始
日志(格式('要提取的文件的总大小为%d MB',[ArcTotalSize]);
ArcTotalExtracted:=0;
对于I:=0到GetArrayLength(ArcArchives)-1 do
开始
ArcExtracted:=0;
ArchivePath:=ArcArchives[I];
日志(格式('提取%s',[ArchivePath]);
FreeArcCmd('x','-o+','-dp'+DestPath,'-w'+DestPath,'--',ArchivePath,
'', '', '', '');
ArcTotalExtracted:=ArcTotalExtracted+ArcExtracted;
结束;
结束;
程序按钮点击(发送方:ToObject);
开始
ArcCancel:=真;
结束;
程序提取弧;
变量
PrevCancelButton单击:TNotifyEvent;
开始
第页:=
CreateOutputProgressPage('解压缩','解压缩存档…');
ArcProgressPage.SetProgress(01100);
ArcProgressPage.Show;
尝试
WizardForm.CancelButton.Visible:=True;
WizardForm.CancelButton.Enabled:=True;
PrevCancelButtonClick:=WizardForm.CancelButton.OnClick;
WizardForm.CancelButton.OnClick:=@UnpackCancelButton单击;
尝试
AddArchive(ExpandConstant({src}\test1.arc');
AddArchive(ExpandConstant({src}\test2.arc');
日志(“电弧提取开始”);
(ExpandConstant({app}'));
除了
MsgBox(GetExceptionMessage(),mbError,MB_OK);
结束;
最后
日志(“弧提取完成”);
隐藏;
WizardForm.CancelButton.OnClick:=PrevCancelButton单击;
结束;
结束;
过程CurStepChanged(CurStep:TSetupStep);
开始
如果CurStep=ssPostInstall,则
开始
提取弧;
结束;
结束;
对于,您需要Inno设置6。如果您坚持使用Inno Setup 5,则可以使用库中的
WrapCallback
函数