如何正确启动更新程序?

时间:2012-09-11 18:23:15

标签: windows winapi language-agnostic

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

它说:

  

如果...进程将指定SEE_MASK_NOASYNC标志   ShellExecuteEx返回后不久终止。在这种情况下,   调用线程将无法完成DDE   对话,所以ShellExecuteEx完成后很重要   将控制权返回给调用应用程序之前的对话   未能完成对话可能会导致失败   发布文件。

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

3 个答案:

答案 0 :(得分:4)

你必须打电话给ShellExecute吗?我做类似的事情,并通过CreateProcess启动,它工作正常。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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