我对许多“标准”安装程序使用 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()
运行时显示进度条(这将是理想的),并且将其放入自定义向导页面让我感到困惑。
{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?
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;
然后我更改了“就绪”页面上的文本以适合使用[消息]部分。
结果是: