应用程序关闭后如何执行代码?

How to execute code after application closure?

对于自建安装程序,我需要一种在应用程序本身关闭后执行代码的方法。

应用结构

  1. 主应用程序:安装程序在需要时从中启动,并在此过程中自行关闭。
  2. 安装程序: 这也位于主应用程序的文件夹中,因此也访问所有 dll 文件。当更新可用时,首先下载 zip 文件,然后将其解压缩到 temp 文件夹中。之后,所有文件都从那里移动到共享应用程序目录。

问题

问题是更新程序只能在运行时更新一些自己不使用的dll文件,因为有些由于安装程序的访问而被写保护。

一个解决方案

必须在关闭安装程序后将文件从临时文件夹移动到共享应用程序文件夹。但是我不知道怎么实现。

非常感谢!

您的问题暗示 Windows。我会从Win32的角度提出建议。

在我们的应用程序中,我们遇到了类似的问题。我们的应用程序会定期将更新可执行文件下载到临时文件夹中,然后启动它。当更新 EXE 运行时,它会确保主应用程序已经退出,将文件解压缩到应用程序的安装文件夹中,然后再次启动应用程序备份。它实际上比这更复杂,因为它确实将新文件复制到不同的安装文件夹中,但我会保存这些细节,除非你真的需要它。

The problem is that the updater can only update a few dll files at runtime that are not used by itself, because some are write-protected due to the installer's access.

这是你问题的核心。我的建议是让安装程序 EXE 静态链接到 VC 运行时和它与应用程序共享的其他代码。也就是说,没有所有的 DLL 依赖项。如果您确实需要在安装程序和应用程序之间共享代码,但仍希望应用程序使用 DLL,您可以这样做。将共享代码构建为 DLL(带有存根库)和完整的 LIB。可能需要对您的构建进行一些小的重构或冗余构建相同的源文件。安装程序代码链接到完整的 LIB。应用程序代码像现在一样链接到 DLL 的存根 LIB。

如果您只是在寻找启动进程的方法,您想要的 API 是 CreateProcess

此外,您是否查看过 Omaha 等开源选项 - Google Chrome 用于静默更新的是什么?

Moving the files from the temp folder to the shared application folder must happen after closing the installer. But I don't know how to realize that.

“Windows 方法”将按照 this blog-post 中的描述使用 PendingFileRenameOperations,并让 Windows 在下次启动时进行移动。当然,这意味着又出现了一条烦人的“请重新启动以完成安装”消息。

如果您的问题是安装程序和主应用程序共享的 DLL,那么您可以这样做:在 运行 安装程序之前,您的主应用程序可以从您的 运行 复制所有需要的 DLL 和安装程序 EXE主应用程序文件夹到一个临时文件夹,并从那里 运行 它。然后,您的安装程序必须等到主应用程序关闭,然后替换主文件夹中的所有文件。更新完成后,删除此安装程序及其 DLL 的临时副本。

请注意,如果您想覆盖 Program Files 文件夹中的文件,您的安装程序必须 运行 具有提升的权限。 Google 用于“运行as”命令...您在使用 QProcess 启动安装程序时需要它。

但可能还有其他问题。如果您的第一次安装是使用普通安装程序,它通常会在注册表中创建一些条目,还会生成文件列表以供以后卸载。如果您的新版本将包含与最初安装的版本不同的文件,那么您后续的卸载可能会出现故障或可能会在用户的计算机上留下一些现有文件。你肯定不想要这个。

还有一个潜在的问题。您可能 运行ning 应用程序的多个实例。在这种情况下,退出一个实例仍会留下其他实例 运行ning,因此安装程序无法替换它们的文件 - 它会失败。

正如您所见,这些都是需要考虑的重要方面。

我是如何在我的软件中做到这一点的,我建议你也试试看?我用 InnoSetup(免费软件!)准备了一个安装程序文件 (.exe)。这可用于首次安装以及自动更新。然后,如果我创建一个新版本并将其放在服务器上,运行ning 主应用程序会检测到它,下载新的安装程序和 运行s 这个安装程序(当然它会询问用户是否应该继续).然后安装程序要求提升权限,要求关闭 运行ning 应用程序(它通常在启动安装程序时自动关闭)并覆盖现有安装。所有这些都是 InnoSetup 创建的安装程序中内置的标准功能。并正确更新卸载说明...我花了好几天时间才根据需要设置所有内容,但效果很好。唯一的“缺点”是它不是完全无声的,它会显示一些对话框。但这对我来说不是真正的问题。也许让用户看到他们计算机上发生的事情会更好...