You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免DLLHost提前关闭或保持Explorer窗口响应(IExplorerCommand场景)

自定义右键菜单IExplorerCommand的DllHost.exe进程提前关闭问题

我实现了一个继承自IExplorerCommand接口的类,它的Invoke()方法会被DllHost.exe进程调用——该进程在Windows 11资源管理器中点击自定义右键菜单时启动。由于Invoke()包含耗时操作,直接在调用线程执行会导致资源管理器窗口无响应,因此我使用std::thread将任务转移至后台线程。

但遇到的问题是:Invoke()触发约5秒后,即使后台线程仍在运行,DllHost.exe进程仍会被强制关闭。我尝试过以下方法均未解决问题:

  • 在后台线程中保留IExplorerCommand实例的引用计数
  • 通过SHGetInstanceExplorer()持有进程句柄
  • 改用SHCreateThread()并传入CTF_COINIT_STA | CTF_PROCESS_REF标志

我还尝试替换为Windows经典示例中的CExplorerCommandVerb类,结果依旧相同。唯一明显差异在于我的类声明与COM/WinRT注册方式:

class __declspec(uuid("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")) MyExplorerCommand final : public Microsoft::WRL::RuntimeClass
    <Microsoft::WRL::RuntimeClassFlags<Microsoft::WRL::ClassicCom>, IExplorerCommand, IObjectWithSite>
{
    ...
}

CoCreatableClass(MyExplorerCommand)
CoCreatableClassWrlCreatorMapInclude(MyExplorerCommand)

我怀疑问题可能源于此注册方式。

我的疑问:

  1. 如何防止DllHost.exe在后台线程完成前关闭?
  2. 或者,如何在Invoke()阻塞时保持资源管理器窗口响应?

内容的提问来源于stack exchange,提问作者Jean-Milost Reymond

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 20:39:58