在某个页面完成后,有没有办法在Inno Setup中提取.zip文件?

时间:2016-11-20 13:17:03

标签: inno-setup

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

我找不到任何地方如何在某个表格之后这样做。我只在运行部分找到了如何完成提取。

1 个答案:

答案 0 :(得分:3)

编辑:我所描述的旧方法证明在某些Windows版本上效果不佳。它可能会弹出一个对话框窗口而不是静默覆盖文件。这很容易谷歌: CopyHere ignores options

新方式:

新方式使用7zip standalone console version。它是单个7za.exe,您不需要DLL。

#include <idp.iss>

; Languages section
; Includes for Mitrich plugin's additional languages
; #include <idplang\Russian.iss>

[Files]
Source: "7za.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall;

[Run]
Filename: {tmp}\7za.exe; Parameters: "x ""{tmp}\example.zip"" -o""{app}\"" * -r -aoa"; Flags: runhidden runascurrentuser;

[Code]
procedure InitializeWizard;
begin
  idpAddFile('https://example.comt/example.zip', ExpandConstant('{tmp}\example.zip'));
  { Download after "Ready" wizard page }
  idpDownloadAfter(wpReady);
end;

如果您想在安装开始前解压缩并使用文件(例如,作为许可协议),我只能提供一般准则:

  1. [Setup]中启用欢迎页面:DisableWelcomePage=no
  2. 使用idpDownloadAfter(wpWelcome);。现在它在“欢迎”页面后立即下载。
  3. 您需要[Setup]LicenseFile=license.txt中的空许可证文件才能显示许可证页面。或者可能不是空的,而是“加载许可协议......”文本。
  4. 您实施procedure CurPageChanged():如果当前页面为wpLicense,则您调用Exec()函数启动7zip并等待它终止。现在[Run]部分没有7zip。然后,您可能使用LoadStringFromFile()函数从提取的文件中获取许可协议。然后把它放到UI中。可能WizardForm.LicenseMemo.RTFText = ...应该有效。无论如何,UI是可访问的,如果您在设置文本时遇到问题,请就此问一个单独的问题。
  5. 旧越野车

    没有unzipper.dll的等效,清洁方式是described here。无论如何,它使用了错误的CopyHere Windows功能。

    #include <idp.iss>
    
    ; Languages section
    ; Includes for Mitrich plugin's additional languages
    ; #include <idplang\Russian.iss>
    
    [Files]
    Source: "unzipper.dll"; Flags: dontcopy
    
    [Code]
    procedure InitializeWizard;
    begin
      idpAddFile('https://example.comt/example.zip', ExpandConstant('{tmp}\example.zip'));
      { Download after "Ready" wizard page }
      idpDownloadAfter(wpReady);
    end;
    
    procedure unzip(src, target: AnsiString);
    external 'unzip@files:unzipper.dll stdcall delayload';
    
    procedure ExtractMe(src, target : AnsiString);
    begin
      unzip(ExpandConstant(src), ExpandConstant(target));
    end;
    
    procedure CurStepChanged(CurStep: TSetupStep);
    begin
      if CurStep = ssPostInstall then 
      begin
        { Extract when "Finishing installation" setup step is being performed. }
        { Extraction crashes if the output dir does not exist. }
        { If so, create it first: }
        { CreateDir(ExpandConstant(...)); }
        ExtractMe('{tmp}\example.zip', '{app}\');
      end;
    end;
    

    您可以尝试其他内容,而不是wpReadyssPostInstall。对于我的小拉链,效果很好。