我正在尝试编写自己的更新源代码来从网络更新我的应用程序,基本上我使用两个 INI 文件。一个在网络上,一个在客户端。客户端保存当前版本号和服务器端 ini 的 url。服务器端 ini 保存最新版本和新下载的 url。
无论如何,一切似乎都很好。文件下载很好,但我想知道如何关闭当前应用程序以运行新下载的文件(安装程序)
我正在尝试编写自己的更新源代码来从网络更新我的应用程序,基本上我使用两个 INI 文件。一个在网络上,一个在客户端。客户端保存当前版本号和服务器端 ini 的 url。服务器端 ini 保存最新版本和新下载的 url。
无论如何,一切似乎都很好。文件下载很好,但我想知道如何关闭当前应用程序以运行新下载的文件(安装程序)
为什么不简单地运行更新程序并立即关闭当前应用程序?
ShellExecute(nil, nil, PathToUpdater, nil, nil, SW_SHOWNORMAL);
Application.Terminate; // Or some other way
更新程序肯定不介意原始进程在其生命周期中存在几毫秒吗?
正常的程序是这样的:
这样做的主要好处是用户不必等待下载发生。一个可能需要时间并且可能失败的过程。从而为用户提供尽可能少的停机时间。
有一个棘手的场景需要处理。那是程序启动更新程序然后自行关闭的时间。如果在更新打开可执行文件之前主进程没有关闭,那么更新程序可能会失败。处理这个问题的最优雅的方法是让主程序将其 PID 传递给更新程序。然后更新程序可以打开该进程的句柄并等待它发出信号。
另一种非常相似的方法是这样的:
老实说,第二种方法对我来说似乎更有吸引力。它具有更好的关注点分离。主程序与其业务有关。更新者关心它的工作。显然,他们之间必须有互动和合作,但这被保持在最低限度。