为啥我的 BHO 无法在 IObjectWithSite::SetSite() 中获取 IWebBrowser2 指针?
Posted
技术标签:
【中文标题】为啥我的 BHO 无法在 IObjectWithSite::SetSite() 中获取 IWebBrowser2 指针?【英文标题】:Why would my BHO fail to obtain IWebBrowser2 pointer inside IObjectWithSite::SetSite()?为什么我的 BHO 无法在 IObjectWithSite::SetSite() 中获取 IWebBrowser2 指针? 【发布时间】:2021-01-08 14:37:58 【问题描述】:我看过许多 BHO 示例,我尝试实现这个常见场景:
STDMETHODIMP CBhoImpl::SetSite(IUnknown* pSite)
if (NULL != pSite)
CComQIPtr<IWebBrowser2> webBrowser(pSite);
// webBrowser should hold a non-null pointer here
// but it holds a null pointer instead
//whatever
// whatever
SetSite()
被调用并进入了if
分支,但QueryInterface()
未能检索到IWebBrowser2
。
我已经看到很多例子完全一样。
我做错了什么?
【问题讨论】:
【参考方案1】:尝试在IUnknown
参数中查询IServiceProvider
,如果成功则可以调用其QueryService()
方法获取IWebBrowser2
,例如:
STDMETHODIMP CBhoImpl::SetSite(IUnknown* pSite)
if (pSite)
CComPtr<IWebBrowser2> webBrowser;
CComQIPtr<IServiceProvider> pServiceProvider(pSite);
if (pServiceProvider)
pServiceProvider->QueryService(SID_SWebBrowserApp, IID_PPV_ARGS(&webBrowser));
else
webBrowser = CComQIPtr<IWebBrowser2>(pSite);
if (webBrowser)
// use webBrowser as needed...
【讨论】:
以上是关于为啥我的 BHO 无法在 IObjectWithSite::SetSite() 中获取 IWebBrowser2 指针?的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Visual Studio 2010 调试 C++ BHO DLL
如何用普通 C++ 编写一个执行我的 javascript 的 IE BHO