如何正确启动更新程序?

Posted

技术标签:

【中文标题】如何正确启动更新程序?【英文标题】:How do I launch an updater properly? 【发布时间】:2012-09-11 18:23:15 【问题描述】:

我有一个需要能够自我更新的程序。我有第二个程序将执行更新、下载和安装。更新程序显然需要能够更新主程序,为此,主程序无法运行。所以我想让主程序通过调用ShellExecuteEx 来启动更新程序,但是the MSDN documentation 让我有点困惑。

上面写着:

如果 ... 进程将 ShellExecuteEx 返回后很快终止。在这样的条件下, 调用线程将无法完成 DDE 对话,所以 ShellExecuteEx 完成 在将控制权返回给调用应用程序之前进行对话。 未能完成对话可能会导致失败 启动文档。

SEE_MASK_NOASYNC 下,它表示ShellExecuteEx 调用在操作完成之前不会返回。我想要的是启动更新程序,然后立即终止主程序,这样更新程序就可以毫无问题地运行。这是正确的方法吗?为了防止启动的更新程序被标记为在主进程关闭时将被杀死的“子进程”,我需要做些什么特别的事情吗?

【问题讨论】:

【参考方案1】:

你必须调用 ShellExecute 吗?我做了类似的事情并通过 CreateProcess 启动它工作正常。

(实际上,cmd.exe 已启动,它运行一个批处理文件。批处理文件等待,启动更新程序并等待它完成,然后稍等,然后再次启动主应用程序。从来没有遇到过任何问题它)

【讨论】:

【参考方案2】:

DDE 不会用于直接启动 EXE。 (它仅用于启动某些类型的文件,如果它们被注册为需要以这种方式启动。如果您只是按名称运行 EXE,则 DDE 应该无关紧要。)

因此,您应该指定 SEE_MASK_NOASYNC(以确保 ShellExecuteEx 调用完成了它需要做的所有事情,然后您的应用可以在调用返回后立即结束线程)并且 API 应该很快返回。

【讨论】:

【参考方案3】:

这是一篇关于启动更新程序的优秀 CodeProject 文章: http://www.codeproject.com/Articles/395572/Executable-Integration-Example-External-settings-a

【讨论】:

以上是关于如何正确启动更新程序?的主要内容,如果未能解决你的问题,请参考以下文章

更新的启动/启动不起作用

如何在 React Apollo 2.0 中正确地重新获取和缓存更新的数据?

树莓派程序延迟

无论应用程序状态如何,都可以从通知中正确启动 Activity

电脑启示应用程序无法启动,因为应用程序的并行配置不正确,如何解决?

如何以正确的方式制作启动画面,即不使其成为应用程序流程的一部分?