停止当前应用程序并运行更新应用程序

时间:2013-04-11 14:27:32

标签: delphi delphi-xe3

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

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

2 个答案:

答案 0 :(得分:6)

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

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

当然,更新程序并不介意原始进程在其生命周期中存在几毫秒?

答案 1 :(得分:4)

正常程序是这样的:

  1. 主程序检测到更新已准备就绪。
  2. 主程序以静默方式将更新下载到临时位置。下载在后台线程中执行。
  3. 下载完成并验证后,主程序将重新启动。
  4. 每当程序启动并注意到有等待安装的新更新时,它会终止并运行一个执行更新的单独可执行文件。
  5. 更新完成后,程序将重新启动。
  6. 这样做的主要好处是不会强迫用户等待下载。一个可能需要时间并可能失败的过程。从而为用户提供尽可能少的停机时间。

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

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

    1. 主程序检测到更新已准备就绪,并触发单独的可执行文件以执行更新。或者,主程序会定期触发更新程序以检查是否有可用的更新。
    2. 更新过程以静默方式将更新下载到临时位置。
    3. 下载完成并经过验证后,更新程序会通知主进程终止。
    4. 一旦主进程终止(更新程序等待它执行),更新程序将执行更新。
    5. 更新完成后,重新启动主程序。
    6. 说实话,第二种方法似乎对我更有吸引力。它有更好的关注点分离。主要计划涉及其业务。更新程序关注其工作。显然,他们之间必须有互动和合作,但这是最低限度的。