在异步可插入协议线程中 - 这怎么可能 associated/resolved 到实现 ::SetSite() 的特定 COM 对象?

In an Asynchronous Pluggable Protocol thread - how can this be associated/resolved to a particular COM object implementing ::SetSite()?

在 IE11 中,当访问诸如 www.yahoo.com 之类的站点时,多个线程将触发应用程序 - 这些线程中只有非常小的一个子集可以与浏览器相关联 window(通过查询创建选项卡时在 ::SetSite() 调用中传递的服务提供商等)。

这不适用于现代网站上的大多数线程(例如 www.evernote.com)

我如何确定线程代表哪个 IE 选项卡 - 或者这是不可能的?

我很想知道有一些方法可以将这些线程与传递给 ::SetSite() 的 pUnkSite(或类似的东西)相匹配——但这似乎与我到目前为止所经历的 IE 模型不同.

谢谢。

尝试 Switch/Continue 技巧。你的应用程序会像这样调用 IInternetProtocolSink::Switch,例如在 Start:

PROTOCOLDATA data = {0};
data.grfFlags = PD_FORCE_SWITCH;  // important
pProtocolSink->Switch(&data);

最终,客户端将转身并在主 UI 线程上对您调用 IInternetProtocol::Continue。一旦进入主线程,IServiceProvider::QueryService(IID_IWindowForBindingUI) 之类的东西应该可以工作,并帮助您连接回请求浏览器 and/or 文档。