这是困扰我一段时间的事情,必须有一个解决方案。每次我调用 ShellExecute 打开一个外部文件(无论是文档、可执行文件还是 URL)时,都会在 ShellExecute 生成新进程并返回之前在我的程序中造成很长时间的锁定。有谁知道如何解决或解决这个问题?
编辑:正如标签所示,这是在使用 C++ 的 Win32 上。
这是困扰我一段时间的事情,必须有一个解决方案。每次我调用 ShellExecute 打开一个外部文件(无论是文档、可执行文件还是 URL)时,都会在 ShellExecute 生成新进程并返回之前在我的程序中造成很长时间的锁定。有谁知道如何解决或解决这个问题?
编辑:正如标签所示,这是在使用 C++ 的 Win32 上。
我不知道是什么原因造成的,但 Mark Russinovich(以 sysinternal 闻名)有一个非常棒的博客,他解释了如何调试这些东西。The Case of the Delayed Windows Vista File Open Dialogs对您来说是一个不错的选择,他仅使用进程资源管理器调试了一个类似的问题(事实证明这是访问域的问题)。您当然可以使用常规的 Windows 调试器来做类似的事情。
你的问题可能和他的不一样,但是使用这些技术可以帮助你更接近问题的根源。我建议调用该CreateProcess
调用,然后捕获一些堆栈跟踪并查看它似乎挂起的位置。
流程启动延迟的案例可能与您更相关。
你是多线程的吗?
我已经看到使用 ShellExecute 打开文件的问题。不是可执行文件,而是与应用程序相关的文件 - 通常是 MS Office。使用 DDE 打开其文件的应用程序向所有线程(好吧,我不知道是否全部...)程序进行了一些消息广播。因为我没有在我的应用程序的工作线程中发送消息,所以我会挂起 shell(以及文件的打开)一段时间。它最终超时等待我处理消息,应用程序将启动并打开文件。
我记得在循环中使用 PeekMessage 来删除该工作线程队列中的消息。我一直认为有办法以另一种方式避免这种情况,也许以不同的方式创建线程,以免成为消息的目标?
更新 它一定不仅仅是任何线程在做这件事,而是一个服务窗口的线程。Raymond (链接 1)无所不知(链接 2)。我打赌 CoInitialize(单线程单元)或 MFC 中的某些东西为线程创建了一个隐藏窗口。