我正在使用浏览器助手对象,我正在尝试访问触发事件的IWebBrowser2。使用NavigateComplete2和其他事件,我可以很容易地做到这一点,因为我得到了Invoke参数的指针。
但是我在msdn上阅读this并且它说TitleChange事件的唯一参数是标题,所以如何从事件TitleChange获取指向webbrowser接口的指针?
以下是我如何使用其他活动:
HRESULT STDMETHODCALLTYPE CSiteEvents::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS __RPC_FAR *Params, VARIANT __RPC_FAR *pVarResult,
EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr )
{
switch ( dispIdMember )
{
case DISPID_DOCUMENTCOMPLETE:
{
IWebBrowser2 *pBrowser = GetBrowser(Params->rgvarg[1]);
// stuff
pBrowser->Release();
}
break;
}
}
IWebBrowser2* GetBrowser(const VARIANT &_Argument)
{
IWebBrowser2 *pBrowser = NULL;
if (_Argument.vt == VT_DISPATCH)
{
HRESULT hr;
IDispatch *pDisp = _Argument.pdispVal;
if (pDisp)
{
hr = pDisp->QueryInterface( IID_IWebBrowser2, reinterpret_cast<void **>(&pBrowser) );
if ( FAILED(hr) )
pBrowser = NULL;
}
}
return pBrowser;
}
我正在使用Visual Studio 2010。
答案 0 :(得分:0)
这里隐含的IDispatch
上下文不是吗?对于其他事件,您必须区分事件发生的控件中的行踪,而TitleChange
它位于顶层 - 这意味着this
是IDispatch*
,可以查询获取你需要的界面。
DWebBrowserEvents2
继承自IDispatch
,但也为窗口的每个组件封装了另一个IDispatch
。
答案 1 :(得分:0)
标题只能在主窗口中更改,因此您可以使用从IUnknown检索的IWebBrowser2传递给您的SetSite实现。
STDMETHODIMP CMyBHO::SetSite(IUnknown *punkSite)
{
if(punkSite != NULL)
{
// CComPtr<IWebBrowser2> m_pWebBrowser is member of CMyBHO class
CComQIPtr<IServiceProvider> pServiceProvider = punkSite;
if(pServiceProvider != NULL)
pServiceProvider->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (void**)&m_pWebBrowser);
}
else
{
if(m_pWebBrowser != NULL)
{
m_pWebBrowser = NULL;
}
}
return IObjectWithSiteImpl<CMyBHO>::SetSite(punkSite);
}