8

长期Exec安装.NET 3.5,输出脚本基于此: http: //www.blackhillsoftware.com/blog/2006/06/26/using-innosetup-with-the-dotnet-framework/

问题在于它正在使用ewWaitUntilTerminated,因为我们需要捕获退出代码。由于我们正在运行它/passive /norestart以减少用户方面的工作(也许我们不应该?)

我能想到的最简单的选择是在安装.NET 时隐藏窗口并在完成后再次显示它,但我不知道该怎么做。

理想的解决方案是显示一个进度页面,但这似乎不太可能,因为我们需要立即返回,但在进程退出时仍会以某种方式收到通知并捕获退出代码,否则我们会只是有一个永恒的进度条。

关于如何解决这个问题的任何想法?

编辑:最小化可能会更好,但也不知道该怎么做。我们确实会显示一条消息,通知用户该过程可能需要 10-20 分钟,但问题是主设置表单完全冻结,无法移动、最小化或对其进行任何操作。此外/passive,在较慢的机器上运行 .NET 安装程序实际上并不会在一两分钟内显示任何进度。

4

5 回答 5

10

使 Inno Setup“看起来不冻结”的一种方法是添加一个“假”进度指示器,如选取框,以显示正在发生的事情。但这并不能解决“窗口不可拖动/移动”的问题。

因此,另一种方法是真正解冻 Inno Setup GUI,同时执行长时间运行的进程:“长时间运行的进程”通过ShellExecuteEx(). 然后安装程序使用一个带有条件的while循环 WaitForSingleObject和一个非常小的超时来执行AppProcessMessage

AppProcessMessage本身就是一个辅助函数。它使用“通用”代码重新创建Application.ProcessMessages-ish 过程,使用 WinAPI函数PeekMessage()和. 它的工作是成为 Inno Setup GUI 的消息泵。TranslateMessage()DispatchMessage()

这个技巧使窗口再次响应/可拖动,而“长时间运行的进程”在后台处理。

这是执行循环的来源:

if ShellExecuteEx(ExecInfo) then
begin
  while WaitForSingleObject(ExecInfo.hProcess, 100) = WAIT_TIMEOUT
  do begin
      AppProcessMessage;
      WizardForm.Refresh();
  end;
  CloseHandle(ExecInfo.hProcess);
end;

以下 GIST包含用于在不阻塞 Inno Setup GUI 的情况下执行 7zipunzip.iss的独立 Unzip Helper 的代码,包括使用该功能的点点滴滴。AppProcessMessage

在这种情况下,“解压缩”只是一个示例,您可以将执行的应用程序替换为 .NET 安装程序或任何其他长时间运行的任务。

于 2015-10-17T10:51:33.190 回答
2

尽管这可能很容易,但我不建议在 .Net 安装程序运行时隐藏您的安装程序。我见过其他安装程序这样做,当它发生时,我认为安装已经完成,然后当我发现它真的没有时我很困惑。(当安装真的完成时,我也不能确定。也许它只是再次隐藏了自己。)

您可以在 Inno Setup 向导中显示自定义页面。让这样的页面显示进度条并保持其准确可能是一个挑战,但至少您可以在向导页面上显示一条消息,说明您的安装程序正在等待 .Net 安装程序,然后再继续。请参阅帮助文件的“使用自定义向导页面”部分。

于 2009-02-26T19:17:23.390 回答
2

您可以通过调用简单地隐藏安装程序向导表单

WizardForm.Hide;
Exec(...);
WizardForm.Show;

虽然我同意这不是很漂亮。

于 2009-02-26T19:41:09.590 回答
0

我们需要安装带有几个产品的 .NET,并采取了两种方法:

  • 使用 Innosetup 安装 .NET 时,我们让用户知道安装将需要很长时间,并在安装完成后期待某个消息
  • 我们在没有任何标志的情况下启动 .NET 设置以强制客户端通过它。这样,如果他们更倾向于技术,他们就会知道为什么安装需要这么长时间

老实说,第二个选项的运气更好,特别是现在更多的系统管理员似乎在一定程度上锁定了桌面。

于 2009-02-26T19:18:36.773 回答
0

你问这个问题已经5年了,但无论如何这是我的答案。

在调用 Exec() 之前,您可以设置 Inno Setup 将在主进度条上方显示的消息,如下所示:

WizardForm.StatusLabel.Caption := 'Installing .NET Framework 3.5. Please wait, this can take up to 1 hour...';
于 2014-04-27T02:26:07.313 回答