2010-11-07 79 views
0

我在瀏覽器幫助對象上工作,而我試圖訪問觸發事件的IWebBrowser2。有了NavigateComplete2和其他事件,我可以輕易做到這一點,因爲我得到了Invoke參數的指針。從事件獲取IWebBrowser2指針DISPID_TITLECHANGE

但是我讀的是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

是不是IDispatch背景這裏隱含的?對於其他事件,您必須區分事件發生的控件中的下落,而TitleChange則位於頂層 - 這意味着thisIDispatch*,可以查詢它以獲取所需的界面。

DWebBrowserEvents2IDispatch繼承,但也封裝窗口的每個組件的另一個IDispatch

+0

你的意思是我應該能夠使用:IWebBrowser2的* pBrowser = NULL; \t \t \t this-> QueryInterface(IID_IWebBrowser2,reinterpret_cast (&pBrowser));? 我試過了,pBrowser是NULL。 – gtilx 2010-11-07 16:32:30

+0

這就是我認爲應該工作 - 抱歉,沒有這樣做......當你嘗試使用'IDispatch'的UUID時會發生什麼? – 2010-11-07 18:50:39

+0

如何使用UUID?你有一些例子嗎? – gtilx 2010-11-08 05:16:36

0

標題只能在主窗口中更改,所以您可以使用IWebBrowser2,從IUnknown中檢索傳遞給您的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); 
}