Inno setup 完成某个页面后,是否有办法在Inno安装程序中提取.zip文件?

Inno setup 完成某个页面后,是否有办法在Inno安装程序中提取.zip文件?,inno-setup,Inno Setup,所以我基本上在我的{tmp}目录中有一个.zip文件,我想在{tmp}中提取它的内容,但只有当我的第三个表单完成它的工作时,而不是更早。原因是:因为在第三种形式中,我从internet下载了这个.zip,并将其保存到{tmp}中。现在,在此之后,我想将这些文件解压缩到{tmp}中,从中我将从解压缩的文件夹中获取文件,如发行说明、许可协议文件,以便在安装程序的其余表单中使用。意思是,已经在第三个表单之后,我正在使用提取的文件 我在任何地方都找不到在某种形式之后如何做到这一点。我只在运行部分找到了提

所以我基本上在我的
{tmp}
目录中有一个.zip文件,我想在
{tmp}
中提取它的内容,但只有当我的第三个表单完成它的工作时,而不是更早。原因是:因为在第三种形式中,我从internet下载了这个.zip,并将其保存到
{tmp}
中。现在,在此之后,我想将这些文件解压缩到
{tmp}
中,从中我将从解压缩的文件夹中获取文件,如发行说明、许可协议文件,以便在安装程序的其余表单中使用。意思是,已经在第三个表单之后,我正在使用提取的文件


我在任何地方都找不到在某种形式之后如何做到这一点。我只在运行部分找到了提取是如何完成的。

编辑:我描述的旧方法在某些Windows版本上无法正常工作。它可能会弹出一个对话框窗口,而不是默默地覆盖文件。谷歌很容易做到这一点:

新方式:

新的方法使用。它是一个单独的
7za.exe
,您不需要DLL

#包括
; 语文组
; 包括Mitrich插件的其他语言
; #包括
[档案]
资料来源:“7za.exe”;DestDir:“{tmp}”;标志:deleteafterinstall;
[运行]
文件名:{tmp}\7za.exe;参数:“x”“{tmp}\example.zip”“-o”“{app}\”“*-r-aoa”;标志:runhidden runascurrentuser;
[守则]
程序初始化;
开始
idpAddFile('https://example.comt/example.zip,ExpandConstant({tmp}\example.zip');
{在“就绪”向导页面后下载}
idpDownloadAfter(wpReady);
结束;
如果您想在安装开始之前下载、解压缩和使用文件(例如,作为许可协议),我只能给出一般性的指导原则:

  • [设置]
    中启用欢迎页面:
    禁用欢迎页面=否
  • 使用
    idpDownloadAfter(wpWelcome)。现在它在“欢迎”页面后立即下载
  • 您需要在
    [Setup]
    中有一个空的许可证文件:
    LicenseFile=license.txt
    才能显示许可证页面。或者可能不是空的,但带有“加载许可协议…”文本
  • 实现
    过程CurPageChanged()
    :如果当前页面是
    wplicence
    ,则调用
    Exec()
    函数启动7zip并等待其终止。现在,
    [Run]
    部分没有7zip。然后您可能会使用
    LoadStringFromFile()
    函数从提取的文件中获取许可协议。然后把它放到UI中。可能
    WizardForm.licensemo.RTFText=…
    会起作用。无论如何,用户界面是可访问的,如果您在设置文本时遇到问题,请就此单独提问
  • 旧的马车方式:

    没有
    unzipper.dll
    的等效、更干净的方法是。不管怎样,它使用了有缺陷的Windows功能

    #包括
    ; 语文组
    ; 包括Mitrich插件的其他语言
    ; #包括
    [档案]
    来源:“unzippers.dll”;标志:dontcopy
    [守则]
    程序初始化;
    开始
    idpAddFile('https://example.comt/example.zip,ExpandConstant({tmp}\example.zip');
    {在“就绪”向导页面后下载}
    idpDownloadAfter(wpReady);
    结束;
    程序解压缩(src,目标:AnsiString);
    外部的unzip@files:unzipper.dll stdcall delayload';
    程序提取器(src,目标:AnsiString);
    开始
    解压(ExpandConstant(src),ExpandConstant(target));
    结束;
    过程CurStepChanged(CurStep:TSetupStep);
    开始
    如果CurStep=ssPostInstall,则
    开始
    {在执行“完成安装”设置步骤时提取。}
    {如果输出目录不存在,则提取崩溃。}
    {如果是,请先创建:}
    {CreateDir(ExpandConstant(…);}
    ExtractMe({tmp}\example.zip',{app}\');
    结束;
    结束;
    

    您可能可以尝试其他方法,而不是
    wpredy
    ssPostInstall
    。对于我的小拉链,这个效果很好。

    请展示一下您的小拉链。编辑您的帖子并添加Inno安装脚本的相关部分,让我们知道您使用的插件。我必须在周一这样做,因为在那之前我没有那台电脑。我没有任何用于提取的插件,只是通过互联网下载。请注意,使用
    unzipper.dll
    是一种过度使用。您可以使用本机Pascal脚本代码实现相同的功能。看。@MartinPrikryl很好,谢谢。如果效果好,我会检查并编辑我的答案。@MartinPrikryl我发现
    CopyHere
    可能会忽略某些Windows版本上的选项。我更新了我的答案,现在我只使用7zip。这些标志适用于Windows Vista和更新版本。我已将此添加到我的答案中。请确保在
    7za.exe
    参数中的
    {tmp}
    {app}
    周围添加双引号。