Inno setup 仅将Inno安装UI用作自解压器-无需安装

Inno setup 仅将Inno安装UI用作自解压器-无需安装,inno-setup,progress,wizard,Inno Setup,Progress,Wizard,我对许多“标准”安装程序使用Inno安装程序,但对于此任务,我需要提取一组临时文件,运行其中一个,然后删除它们并退出安装程序(不实际安装任何东西) 基本上,我正在寻找一个无需“安装程序”的自解压器,并希望通过inno安装获得最佳的用户体验 我有以下代码,几乎可以正常工作: [Files] Source: "dist\*"; Flags: recursesubdirs ignoreversion dontcopy; [代码] 函数InitializeSetup():Boolean; 变量 结果代

我对许多“标准”安装程序使用Inno安装程序,但对于此任务,我需要提取一组临时文件,运行其中一个,然后删除它们并退出安装程序(不实际安装任何东西)

基本上,我正在寻找一个无需“安装程序”的自解压器,并希望通过inno安装获得最佳的用户体验

我有以下代码,几乎可以正常工作:

[Files]
Source: "dist\*"; Flags: recursesubdirs ignoreversion dontcopy;
[代码]
函数InitializeSetup():Boolean;
变量
结果代码:整数;
开始
结果:=真;
MsgBox('请稍等一两分钟…',mbInformation,MB_OK);
提取临时文件('{tmp}\*');
Exec(ExpandConstant({tmp}\MyScript.exe'),'','',SW_HIDE,ewwaitunFilterminated,ResultCode);
中止();
结束;
问题是,我在这里能做的最好的事情就是显示一个消息框“请稍等一两分钟…”,用户单击[确定],然后在屏幕上没有任何显示时等待,然后启动
MyScript.exe

我想要的是一个带有
npbstMarquee
风格进度条的向导页面,上面写着“提取临时文件时请稍候…”,然后在提取文件和启动脚本后消失


我认为没有办法告诉Inno安装程序在
ExtractTemporaryFiles()
运行时显示进度条,而将其应用到自定义向导页面让我感到困惑。

看来ExtractTemporaryFiles()基本上会将UI锁定,直到完成,所以无法获得进度条(或字幕)在这里动画

在ExtractTemporaryFiles()正在进行时,要在屏幕上显示消息也很困难。我这样解决了这个问题:

const
  WM_SYSCOMMAND = 274;
  SC_MINIMIZE = $F020;
//-------------------------------------------------------------------
procedure MinimizeButtonClick();
begin
  PostMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
end;
//-------------------------------------------------------------------
procedure CurPageChanged(CurPageID: Integer);
var
  ResultCode: Integer;
begin
  if CurPageID = wpPreparing then
  begin
    MinimizeButtonClick();
    Exec(ExpandConstant('{tmp}\MyScript.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
  end;
end;
//-------------------------------------------------------------------
function NextButtonClick(CurPageID: Integer): Boolean;
var
  ProgressPage: TOutputProgressWizardPage;
begin
  if CurPageID = wpReady then
  begin
    ProgressPage := CreateOutputProgressPage('Preparing files...', '');
    ProgressPage.Show;
    try
      ProgressPage.Msg1Label.Caption := 'This process can take several minutes; please wait ...';
      ExtractTemporaryFiles('{tmp}\*');
    finally
      ProgressPage.Hide;
    end;
  end;
  Result := True;
end;
//-------------------------------------------------------------------
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
    //MinimizeButtonClick() is called here as the Wizard flashes up for a second
    // and minimizing it makes that 1/2 a second instead...
    MinimizeButtonClick();
    Abort();
  end;
end;
然后,我更改了“Ready”页面上的文本,以适应使用[Messages]部分

结果是:

  • 一个向导页面询问用户是否要继续
  • 在提取临时文件时,一个向导页面告诉用户“请稍候…”
  • 提取文件后,将隐藏向导,并运行临时文件夹中的MyScript.exe
  • 一旦MyScript.exe完成,向导将干净地退出并删除临时文件
      • 将文件“安装”到,而不是使用
        ExtractTemporaryFiles
      • 执行从中提取到
        {tmp}
        的文件(或使用
        AfterInstall
        参数或
        CurStepChanged
        在安装文件后触发Pascal脚本代码)
      • 设置为
        no
      • 设置为
        no
      • 用于编辑过于以安装程序为中心的向导文本,以满足您的需要
      注:

      • 当“安装程序”关闭时,
        {tmp}
        文件夹被自动删除
      • 安装到新的空文件夹时,不需要
        ignoreversion
        标志
      一个相关问题:



      有关您的文字问题的答案,请参阅。或关于以下主题的更一般的问题:

      非常棒的答案;非常干净的响应用户体验和非常简单的脚本。[Messages]部分可用于根据需要调整所有文本。
      [Setup]
      Uninstallable=no
      CreateAppDir=no
      
      [Files]
      Source: "dist\*"; DestDir: {tmp}; Flags: recursesubdirs
      
      [Run]
      FileName: "{tmp}\MyScript.exe"