Inno setup 仅将Inno安装UI用作自解压器-无需安装
我对许多“标准”安装程序使用Inno安装程序,但对于此任务,我需要提取一组临时文件,运行其中一个,然后删除它们并退出安装程序(不实际安装任何东西) 基本上,我正在寻找一个无需“安装程序”的自解压器,并希望通过inno安装获得最佳的用户体验 我有以下代码,几乎可以正常工作:Inno setup 仅将Inno安装UI用作自解压器-无需安装,inno-setup,progress,wizard,Inno Setup,Progress,Wizard,我对许多“标准”安装程序使用Inno安装程序,但对于此任务,我需要提取一组临时文件,运行其中一个,然后删除它们并退出安装程序(不实际安装任何东西) 基本上,我正在寻找一个无需“安装程序”的自解压器,并希望通过inno安装获得最佳的用户体验 我有以下代码,几乎可以正常工作: [Files] Source: "dist\*"; Flags: recursesubdirs ignoreversion dontcopy; [代码] 函数InitializeSetup():Boolean; 变量 结果代
[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
在安装文件后触发Pascal脚本代码)CurStepChanged
- 设置为
no
- 设置为
no
- 用于编辑过于以安装程序为中心的向导文本,以满足您的需要
- 当“安装程序”关闭时,
文件夹被自动删除{tmp}
- 安装到新的空文件夹时,不需要
标志ignoreversion
有关您的文字问题的答案,请参阅。或关于以下主题的更一般的问题:非常棒的答案;非常干净的响应用户体验和非常简单的脚本。[Messages]部分可用于根据需要调整所有文本。
[Setup]
Uninstallable=no
CreateAppDir=no
[Files]
Source: "dist\*"; DestDir: {tmp}; Flags: recursesubdirs
[Run]
FileName: "{tmp}\MyScript.exe"