长的Exec正在安装.NET 3.5,并且脚本基于这个:http: //www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/
问题是它使用"ewWaitUntilTerminated"因为我们需要捕获退出代码.由于我们正在运行它/ passive/norestart,因此它对用户的影响较小(也许我们不应该?),这会让情况变得更糟.
我能想到的最简单的选择是在安装.NET时隐藏窗口并在完成后再次显示它,但我不知道该怎么做.
理想的解决方案是显示一个进度页面,但它似乎不可能,因为我们需要立即返回,但在进程退出并捕获退出代码时仍然会以某种方式通知,否则我们会只是有一个永恒的进步吧.
关于如何解决这个问题的任何想法?
编辑:最小化可能会更好,但不知道如何做到这一点.我们会显示一条消息,通知用户该过程可能需要10-20分钟,但问题是主设置表单已完全冻结,无法移动,最小化或对其执行任何操作.同样运行/被动.NET安装程序实际上并没有在较慢的机器上显示任何一两分钟的进度.
我在CurStepChanged(ssPostInstall)PascalScripting事件处理程序中的InnoSetup脚本中执行了很多自定义操作.由于这些操作需要一些时间才能完成,我想更新InnoSetup Wizard GUI状态文本并告诉用户幕后发生了什么.使用"StatusMsg"参数在[Run]部分中可能出现的类似情况.我知道我可以使用TOutputProgressWizardPage/CreateOutputProgressPage(),我在之前的项目中做过,但这对我来说有点太过分了......
是否更容易从PascalScripting代码更新InnoSetup Wizard GUI状态文本,其效果与StatusMsg参数相同?
我的InnoSetup GUI在解压缩操作期间被冻结.
我有一个procedure DoUnzip(source: String; targetdir: String)核心
unzipTool := ExpandConstant('{tmp}\7za.exe');
Exec(unzipTool, ' x "' + source + '" -o"' + targetdir + '" -y',
'', SW_HIDE, ewWaitUntilTerminated, ReturnCode);
Run Code Online (Sandbox Code Playgroud)
多次调用此过程,Exec操作会阻止用户界面.执行之间只有很短的时间,Inno GUI可拖动/可移动.
我知道还有其他选择TExecWait代替ewWaitUntilTerminated,比如ewNoWait和ewWaitUntilIdle,但不幸的是它们在这种情况下没有帮助.使用ewNoWait将导致同时执行多个解压缩操作.
我正在寻找一种方法来执行外部解压缩操作并等待它完成,但不会阻止用户界面.我该如何实现呢?
以下是我的笔记和想法:
等待进程完成,正在阻塞,除非您将在与主要进程不同的线程中等待.我认为当解压缩操作完成时需要进行某种回调.
我知道InnoSetup不提供开箱即用的功能,请参阅https://github.com/jrsoftware/issrc/issues/149
在StackOverflow上搜索相关问题时,我想出了一个问题:使用回调来显示来自外部解压缩dll(Inno Setup)的文件名,在那里我找到了Mirals的答案.它使用InnoCallback与另一个DLL结合使用.
我认为,在我的情况下,这可能是7zxa.dll解压缩操作.但它不接受回调.因此,以下代码只是一个概念/想法草案.一个问题是,它7zxa.dll不接受回调.另一个问题是7zxa API并不真正邀请使用.
[Code]
type
TMyCallback = procedure(Filename: PChar);
// wrapper to tell callback function to InnoCallback
function WrapMyCallback(Callback: TMyCallback; ParamCount: …Run Code Online (Sandbox Code Playgroud) 我根据用户的选择制作了自定义页面来管理特定的 redist 工具安装。
如果用户想要或不安装这些工具,这些工具会链接到用户选中的复选框。然后出现一个页面,向用户展示每个工具的安装进度。
我在这里遇到的问题是,只有在ExtractTemporaryFile工具的第一个设置完成后才会显示进度页面,显示最后一个页面就好像它已经冻结一样。
我必须让进度页面在ExtractTemporaryFile发生之前显示的唯一方法是MsgBox在任何安装函数之前放置一个。但即使在这种情况下,ExtractTemporaryFile启动时,进度条动画也会冻结,直到ExtractTemporaryFile完成...
这是执行此操作的代码部分:
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=PageInstallationPersonnalisee.ID then
begin
ProgressBarLabelPageInstPerso.Caption := 'Initialisation...';
if InstallTool1 = True then
begin
ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool1...';
F_InstallTool1();
end;
if InstallTool2 = True then
begin
ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool2...';
F_InstallTool2();
end;
if InstallTool3 = True then
begin
ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool3...';
F_InstallTool3();
end;
ProgressBarPageInstPerso.Style := npbstMarquee;
//ProgressBarPageInstPerso.Style := npbstNormal;
ProgressBarPageInstPerso.Position := 100;
CancelWithoutPrompt:=True;
WizardForm.Close;
end;
end;
Run Code Online (Sandbox Code Playgroud)
请注意,ExtractTemporaryFile()是在每个 …
我对许多“标准”安装程序使用 Inno Setup,但对于此任务,我需要提取一堆临时文件,运行其中一个,然后删除它们并退出安装程序(不实际安装任何内容)。
基本上,我希望制作一个自解压器,而不是“安装程序”,并且追求通过 inno setup 获得最佳的用户体验。
我有以下代码,几乎可以正常工作:
[Files]
Source: "dist\*"; Flags: recursesubdirs ignoreversion dontcopy;
Run Code Online (Sandbox Code Playgroud)
[Files]
Source: "dist\*"; Flags: recursesubdirs ignoreversion dontcopy;
Run Code Online (Sandbox Code Playgroud)
问题是,我在这里能做的最好的事情就是显示一个消息框“请稍等一两分钟...”,用户单击[确定],然后等待,因为屏幕上根本没有任何内容,似乎什么也没有发生,然后MyScript.exe开始。
我想要的是一个向导页面,上面写着“请稍候,临时文件被提取...”,并带有npbstMarquee样式进度条,然后一旦文件被提取并且我的脚本启动,它就会消失。
我认为没有办法告诉 Inno Setup 在ExtractTemporaryFiles()运行时显示进度条(这将是理想的),并且将其放入自定义向导页面让我感到困惑。
我的应用程序有一个安装文件,它还包含 .exe 文件和 .zip 文件。
最近我在从zip中提取文件的部分添加了一段代码[Code],但实际上,它是在安装完成后发生的,并且进度条为100%,所以我想要的是使该代码的(解压缩)过程与进度条并向用户显示当前正在提取的内容。
例如:假设提取文件将占用进度条的 50%,其余部分将占用解压缩时的代码部分,以及当前正在提取的内容的状态。
[Code]
procedure InitializeWizard;
begin
ForceDirectories(ExpandConstant('{localappdata}\folder-A\app\folder-B'))
end;
const
SHCONTCH_NOPROGRESSBOX = 4;
SHCONTCH_RESPONDYESTOALL = 16;
procedure unzip(ZipFile, TargetFldr: variant);
var
shellobj: variant;
SrcFldr, DestFldr: variant;
shellfldritems: variant;
begin
if FileExists(ZipFile) then begin
if not DirExists(TargetFldr) then
if not ForceDirectories(TargetFldr) then begin
MsgBox('Can not create folder '+TargetFldr+' !!', mbError, MB_OK);
Exit;
end;
shellobj := CreateOleObject('Shell.Application');
SrcFldr := shellobj.NameSpace(ZipFile);
DestFldr := shellobj.NameSpace(TargetFldr);
shellfldritems := SrcFldr.Items;
DestFldr.CopyHere(
shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL);
end;
procedure …Run Code Online (Sandbox Code Playgroud) 我目前正在安装.NET Framework 4.6.2作为PrepareToInstall事件功能的先决条件,以便我可以获取退出代码,设置NeedsReboot状态或在安装失败时中止.我的代码在下面,这一切都正常.
var
PrepareToInstallLabel: TNewStaticText;
PrepareToInstallProgressBar: TNewProgressBar;
intDotNetResultCode: Integer;
CancelWithoutPrompt, AbortInstall: Boolean;
function InitializeSetup(): Boolean;
begin
Result := True;
OverwriteDB := False;
CancelWithoutPrompt := False;
AbortInstall := False;
end;
function PrepareToInstall(var NeedsRestart: Boolean): String;
var
intResultCode: Integer;
strInstallType: String;
begin
if not IsDotNet45Installed and IsWindows7Sp1OrAbove then
begin
HidePrepareToInstallGuiControls;
PrepareToInstallLabel.Caption := 'Installing Microsoft .NET Framework 4.6.2...';
ShowPrepareToInstallGuiControls;
ExtractTemporaryFile('NDP462-KB3151800-x86-x64-AllOS-ENU.exe');
if WizardSilent = True then
begin
strInstallType := '/q';
end
else
begin
strInstallType := '/passive';
end;
Exec(ExpandConstant('{tmp}\NDP462-KB3151800-x86-x64-AllOS-ENU.exe'), strInstallType …Run Code Online (Sandbox Code Playgroud) 您好,我想知道如何在 Inno Setup Pascal Script 中将工作(或命令)延迟指定的时间。
内置功能会在Sleep(const Milliseconds: LongInt)睡觉时冻结所有工作。
我实现的以下功能也使WizardForm无响应但不像内置Sleep()功能那样冻结。
procedure SleepEx(const MilliSeconds: LongInt);
begin
ShellExec('Open', 'Timeout.exe', '/T ' + IntToStr(MilliSeconds div 1000), '', SW_HIDE,
ewWaitUntilTerminated, ErrorCode);
end;
Run Code Online (Sandbox Code Playgroud)
我也读过这个,但想不出如何在我的函数中使用它。
我想知道如何WaitForSingleObject在此SleepEx功能中使用。
在此先感谢您的帮助。
我目前有两个 Inno Setup 安装程序。我需要其中一个将其作为子安装程序的状态报告给另一个安装程序,即使它使用VERYSILENT命令运行。
我需要这个来根据子安装程序的安装进度在我的主安装程序中显示一个进度条,因为我不想要任何无限(字幕)进度条。
我还阅读了Delphi 中的 IPC 机制。如何将这种通信能力(如泵)添加到 Inno Setup 源代码中?有什么开始的提示吗?
提前致谢。
inno-setup ×9
pascalscript ×4
installation ×3
installer ×2
.net ×1
7zip ×1
callback ×1
compression ×1
freeze ×1
ipc ×1
progress ×1
progress-bar ×1
sleep ×1
wizard ×1