I use Inno Setup for many \"standard\" installers, but for this task I need to extract a bunch of temp files, run one of them, then remove them and exit the installer (witho
It seems that ExtractTemporaryFiles() essentially locks up the UI until it's finished, so there's no way to get a progress bar (or Marquee) animated in here.
Also getting a message on the screen at all while ExtractTemporaryFiles() is in progress was difficult. I solved it like this:
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;
I then changed the text on the "Ready" page to suit using the [Messages] section.
The result is:
{tmp}, instead of using ExtractTemporaryFiles;{tmp} from Run section (or use AfterInstall parameter or CurStepChanged to trigger Pascal Script code after files are installed);no;no;[Setup]
Uninstallable=no
CreateAppDir=no
[Files]
Source: "dist\*"; DestDir: {tmp}; Flags: recursesubdirs
[Run]
FileName: "{tmp}\MyScript.exe"
Notes:
{tmp} folder gets automatically deleted, when the "installer" is closing;ignoreversion flag, when installing to new empty folder.For an answer your literal question, see Inno setup: ExtractTemporaryFile causes wizard freeze. Or a more generic question on the topic: Inno Setup: How to modify long running script so it will not freeze GUI?