摆脱ShellExecute引起的邪恶延迟

时间:2008-10-07 08:13:55

标签: c++ winapi shellexecute

这是困扰我一段时间的事情,只需要解决这个问题。每次我调用ShellExecute来打开一个外部文件(无论是文档,可执行文件还是URL),这都会导致我的程序中有很长的锁定,然后ShellExecute会生成新进程并返回。有谁知道如何解决或解决这个问题?

编辑:正如标签所示,这是在使用C ++的Win32上。

2 个答案:

答案 0 :(得分:9)

我不知道是什么导致了它,但Mark Russinovich(sysinternal的名声)有一个非常好的博客,他解释了如何调试这些事情。一个值得关注的好人是The Case of the Delayed Windows Vista File Open Dialogs,他只使用进程资源管理器调试了一个类似的问题(结果是访问域的问题)。你当然可以使用常规的Windows调试器来做类似的事情。

您的问题可能与他不一样,但使用这些技术可能会帮助您更接近问题的根源。我建议调用CreateProcess调用,然后捕获一些堆栈跟踪并查看它似乎挂起的位置。

The Case of the Process Startup Delays可能对您更有意义。

答案 1 :(得分:3)

你是多线程的吗?

我见过使用ShellExecute打开文件的问题。不是可执行文件,而是与应用程序关联的文件 - 通常是MS Office。使用DDE打开文件的应用程序向所有线程(有,我不知道它是所有 ...)程序进行了一些消息广播。由于我没有在我的应用程序中的工作线程中抽取消息,因此我会挂起shell(以及文件的开头)一段时间。它最终超时等待我处理消息,应用程序将启动并打开文件。

我记得在一个循环中使用PeekMessage来删除该工作线程队列中的消息。我一直认为有办法以另一种方式避免这种情况,也许以不同的方式创建线程,永远不会成为消息的目标?


<强>更新 它必须不仅仅是任何正在执行此操作的线程,而是一个服务于窗口的线程。 Raymond (link 1)了解所有(link 2) 。我打赌CoInitialize(单线程公寓)或MFC中的东西为线程创建了一个隐藏窗口。