如何正确启动更新程序?
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