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

标签 inno-setup

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

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

最佳答案

编辑:我所描述的旧方法在某些 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;

如果你想在安装开始前下载、解压并使用文件(例如,作为许可协议(protocol)),我只能给出一般指导:

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

老马车:

不带 unzipper.dll 的等效、更简洁的方法是 described here .一种或另一种方式,它使用 buggy 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。对于我的小 zipper ,这很好用。

关于inno-setup - 完成某个页面后,有没有办法在 Inno Setup 中提取 .zip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40704442/

相关文章:

inno-setup - 在 Inno Setup 中备份以前的安装,同时排除某些文件夹(备份文件夹本身)

非 Unicode Inno Setup 中的 C# 字符串

inno-setup - 调用 java 时从 exec 返回“不正确的函数”

c++ - 卸载基于 Inno 的设置时从用户配置文件中删除文件

xml - 创新设置 : how to replace a string in XML file?

windows - 如何使用 Inno Setup 确定是否安装了特定的 Windows 更新包 (KB*.msu)?

inno-setup - 如何允许在 TInputQueryWizardPage 编辑框中只输入字母数字字符?

visual-studio - 设置 Inno 以运行 Office 加载项安装程序并等待它

inno-setup - 在 Inno Setup 中使用字体大小缩放单选按钮列表

windows - 在 Inno Setup 安装中运行另一个安装程序