仅使用 Inno Setup UI 作为自解压程序 - 无需安装

问题描述 投票:0回答:2

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

基本上,我希望制作一个自解压程序,而不是“安装程序”,并且追求通过 inno setup 获得最佳的用户体验。

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

[Files]
Source: "dist\*"; Flags: recursesubdirs ignoreversion dontcopy;
[Code]
function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
begin
  Result := True;
  MsgBox('Please wait a minute or two...', mbInformation, MB_OK);
  ExtractTemporaryFiles('{tmp}\*');
  Exec(ExpandConstant('{tmp}\MyScript.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
  Abort();
end;

问题是,我在这里能做的最好的事情就是显示一个消息框“请稍等一两分钟...”,用户单击[确定],然后等待,因为似乎什么也没有发生,没有任何事情发生-完全屏幕,然后

MyScript.exe
开始。

我想要的是一个向导页面,上面写着 “请稍候,临时文件被提取...” 带有

npbstMarquee
样式的进度条,然后一旦文件被提取并且我的脚本启动,它就会消失。

我认为没有办法告诉 Inno Setup 在

ExtractTemporaryFiles()
运行时显示进度条(这将是理想的),并且将其放入自定义向导页面让我感到困惑。

inno-setup progress wizard
2个回答
7
投票
  • 将文件“安装”到
    {tmp}
    ,而不是使用
    ExtractTemporaryFiles
    ;
  • 执行从
    {tmp}部分
    提取到
    Run
    的文件(或在文件安装后使用
    AfterInstall
    参数或
    CurStepChanged
    触发Pascal脚本代码);
  • Uninstallable
    设置为
    no
  • CreateAppDir
    设置为
    no
  • 使用
    [Messages]
    部分
    编辑过于以安装程序为中心的向导文本,无法满足您的需求。
[Setup]
Uninstallable=no
CreateAppDir=no

[Files]
Source: "dist\*"; DestDir: {tmp}; Flags: recursesubdirs

[Run]
FileName: "{tmp}\MyScript.exe"

备注:

  • 当“安装程序”关闭时,
    {tmp}
    文件夹会自动删除;
  • 安装到新的空文件夹时,不需要
    ignoreversion
    标志。

相关问题:Inno Setup 安装程序仅运行一组嵌入式安装程序


有关字面问题的答案,请参阅Inno setup:ExtractTemporaryFile 导致向导冻结。或者关于该主题的更通用的问题:Inno Setup:如何修改长时间运行的脚本,使其不会冻结 GUI?


0
投票

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;

然后我更改了“就绪”页面上的文本以适合使用[消息]部分。

结果是:

  • 一个向导页面询问用户是否要继续
  • 在提取临时文件时,一个向导页面告诉用户“请稍候...”
  • 文件解压后,向导将隐藏并运行临时文件夹中的 MyScript.exe
  • MyScript.exe 完成后,向导将干净退出并删除临时文件
© www.soinside.com 2019 - 2024. All rights reserved.