【问题标题】:How to execute code after application closure?应用程序关闭后如何执行代码?
【发布时间】:2022-01-14 14:50:00
【问题描述】:

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

应用结构

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

问题

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

解决方案

必须在关闭安装程序后将文件从临时文件夹移动到共享应用程序文件夹。但我不知道如何意识到这一点。

非常感谢!

【问题讨论】:

  • 您也许可以使用QProcess(或等效的 Win32 API)来启动运行 shell 脚本(或等)的独立进程。 shell 脚本可以等到安装程序退出后,然后进行必要的文件移动。
  • 安装程序(也可能是应用程序)可以静态链接,因此它们不依赖于任何 DLL,除了 Windows 附带的那些。我已经为 Windows 制作了大约 16 MB 的静态链接 Qt GUI。

标签: c++ qt


【解决方案1】:

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

请注意,如果您想覆盖 Program Files 文件夹中的文件,您的安装程序必须以提升的权限运行。谷歌搜索“runas”命令...使用QProcess 启动安装程序时将需要它。

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

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

如您所见,这些都是需要考虑的非常严肃的方面。

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    此外,您是否查看过诸如 Omaha 之类的开源选项 - 这是 Google Chrome 用于静默更新的选项?

    【讨论】:

      【解决方案3】:

      必须在关闭安装程序后将文件从临时文件夹移动到共享应用程序文件夹。但我不知道如何意识到这一点。

      “Windows 方式”是使用PendingFileRenameOperations,如this blog-post 中所述,并让Windows 在下次启动时执行此操作。当然,这意味着多了一条恼人的“请重新启动以完成安装”消息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-31
        • 2022-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-27
        • 1970-01-01
        相关资源
        最近更新 更多