如何避免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)
我怀疑问题可能源于此注册方式。
我的疑问:
- 如何防止DllHost.exe在后台线程完成前关闭?
- 或者,如何在
Invoke()阻塞时保持资源管理器窗口响应?
内容的提问来源于stack exchange,提问作者Jean-Milost Reymond
相关产品推荐
相关产品推荐

