0

我正在尝试编写自己的更新源代码来从网络更新我的应用程序,基本上我使用两个 INI 文件。一个在网络上,一个在客户端。客户端保存当前版本号和服务器端 ini 的 url。服务器端 ini 保存最新版本和新下载的 url。

无论如何,一切似乎都很好。文件下载很好,但我想知道如何关闭当前应用程序以运行新下载的文件(安装程序)

4

2 回答 2

6

为什么不简单地运行更新程序并立即关闭当前应用程序?

ShellExecute(nil, nil, PathToUpdater, nil, nil, SW_SHOWNORMAL);
Application.Terminate; // Or some other way

更新程序肯定不介意原始进程在其生命周期中存在几毫秒吗?

于 2013-04-11T14:31:56.840 回答
4

正常的程序是这样的:

  1. 主程序检测到更新已准备就绪。
  2. 主程序以静默方式将更新下载到临时位置。下载在后台线程中执行。
  3. 下载完成并验证后,主程序重新启动。
  4. 每当程序启动并注意到有新的更新等待安装时,它就会终止并运行一个单独的可执行文件来执行更新。
  5. 更新完成后,程序将再次重新启动。

这样做的主要好处是用户不必等待下载发生。一个可能需要时间并且可能失败的过程。从而为用户提供尽可能少的停机时间。

有一个棘手的场景需要处理。那是程序启动更新程序然后自行关闭的时间。如果在更新打开可执行文件之前主进程没有关闭,那么更新程序可能会失败。处理这个问题的最优雅的方法是让主程序将其 PID 传递给更新程序。然后更新程序可以打开该进程的句柄并等待它发出信号。

另一种非常相似的方法是这样的:

  1. 主程序检测到更新已准备好并触发单独的可执行文件以执行更新。或者,主程序会定期启动更新程序以检查是否有可用的更新。
  2. 更新过程以静默方式将更新下载到临时位置。
  3. 下载完成并验证后,更新程序会通知主进程终止。
  4. 一旦主进程终止(更新程序等待它这样做),更新程序就会执行更新。
  5. 更新完成后,主程序重新启动。

老实说,第二种方法对我来说似乎更有吸引力。它具有更好的关注点分离。主程序与其业务有关。更新者关心它的工作。显然,他们之间必须有互动和合作,但这被保持在最低限度。

于 2013-04-11T14:46:35.950 回答