【发布时间】:2020-05-08 09:55:30
【问题描述】:
我正在开发一个自动更新工具。架构如下: 我有一个 GUI 应用程序和一个在它们之间进行通信的服务;安装 gui 应用程序以在每次操作系统启动时运行,服务也是如此。
当 GUI 应用程序发现有新的更新可用时,它会下载更新并要求服务以静默模式运行它(我为此任务使用了一个服务,因为安装程序需要以管理员权限运行而无需用户交互)。此时安装程序以静默模式运行(请记住这是服务的子项,因此它继承服务运行上下文)(作为我使用 nsis 的安装程序系统)并执行当前应用程序的卸载(它删除GUI 应用程序及其二进制文件,停止服务/终止服务,因此基本上它会终止其父亲,从系统中卸载服务并删除其二进制文件)并安装包含新 gui 应用程序和新服务的新软件包。 我想知道在此卸载/安装过程中是否可以避免系统关闭(因为在此过程中关闭可能会损坏应用程序文件和应用程序状态)。
我已阅读有关 WM_QUERYENDSESSION 和 ShutdownBlockReasonCreate 的信息,但由于我的安装程序作为服务的子项运行,因此它在会话 0 中运行,如此处所述https://devblogs.microsoft.com/oldnewthing/20151002-00/?p=91461 我无法使用它们。我也不能使用 SERVICE_ACCEPT_PRESHUTDOWN 标志,因为安装程序会更新服务(因此该标志在服务删除后将不起作用)。
您能建议解决上述问题的方法吗?如果当前架构没有选择,我也愿意重新审视我的软件架构。
谢谢
【问题讨论】:
标签: windows windows-services installation nsis silent-installer