0

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

它说:

如果 ... 进程将在 ShellExecuteEx 返回后很快终止,则必须指定 SEE_MASK_NOASYNC 标志。在这种情况下,调用线程将无法完成 DDE 对话,因此 ShellExecuteEx 在将控制权返回给调用应用程序之前完成对话非常重要。未能完成对话可能会导致文档启动失败。

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

4

3 回答 3

4

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

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

于 2012-09-15T15:16:36.500 回答
1

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

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

于 2012-09-11T20:22:29.103 回答
0

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

于 2012-09-23T04:29:32.120 回答