tags:

views:

11

answers:

0

Hi. I am doing a BHO for Internet Explorer. The problem is only the SetSite is working. BUt the DocumentComplete does not been triggered. I need some help in pointing me what is I am doing wrong.

Here is what I declared inside my header file:

class ATL_NO_VTABLE CStockBar : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CStockBar, &CLSID_StockBar>,
public IDeskBand,
public IObjectWithSite,
public IObjectWithSiteImpl<CStockBar>,
public IInputObject, 
public IDispatchImpl<IStockBar, &IID_IStockBar, &LIBID_MOTLEYFOOLLib>,
public IDispEventImpl<1, CStockBar, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
{
public:
CStockBar();

DECLARE_REGISTRY_RESOURCEID(IDR_STOCKBAR)
DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_CATEGORY_MAP(CStockBar)
//  IMPLEMENTED_CATEGORY(CATID_InfoBand)
//  IMPLEMENTED_CATEGORY(CATID_CommBand)
//  IMPLEMENTED_CATEGORY(CATID_DeskBand)
END_CATEGORY_MAP()

BEGIN_COM_MAP(CStockBar)
COM_INTERFACE_ENTRY(IStockBar)
//  COM_INTERFACE_ENTRY(IInputObject)
COM_INTERFACE_ENTRY(IOleWindow)
COM_INTERFACE_ENTRY_IID(IID_IDockingWindow, IDockingWindow)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand)
COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

BEGIN_SINK_MAP(CStockBar)
    SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()

Here is my SetSite and DocumentComplete functions:

   STDMETHODIMP CStockBar::SetSite(IUnknown* pUnkSite)
   {
    //If a site is being held, release it.
if(m_pSite)
{
    m_ReflectWnd.GetToolBar().SetBrowser(NULL);
    m_pSite->Release();
    m_pSite = NULL;
}
    if (pUnkSite != NULL)
   {
    // Cache the pointer to IWebBrowser2.
   HRESULT hr = pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_spWebBrowser);
   if (SUCCEEDED(hr))
    {
        // Register to sink events from DWebBrowserEvents2.
        hr = DispEventAdvise(m_spWebBrowser);
        if (SUCCEEDED(hr))
        {
            m_fAdvised = TRUE;
        }
    }
}
else
{
  if (m_fAdvised)
    {
        DispEventUnadvise(m_spWebBrowser);
        m_fAdvised = FALSE;
    }
    m_spWebBrowser.Release();
}
//If punkSite is not NULL, a new site is being set.
if(pUnkSite)
{
    //Get the parent window.
    IOleWindow  *pOleWindow = NULL;

    m_hWndParent = NULL;

    if(SUCCEEDED(pUnkSite->QueryInterface(IID_IOleWindow, (LPVOID*)&pOleWindow)))
    {
        pOleWindow->GetWindow(&m_hWndParent);
        pOleWindow->Release();
    }

    if(!::IsWindow(m_hWndParent))
        return E_FAIL;

    if(!RegisterAndCreateWindow())
        return E_FAIL;

    //Get and keep the IInputObjectSite pointer.
    if(FAILED(pUnkSite->QueryInterface(IID_IInputObjectSite, (LPVOID*)&m_pSite)))
    {
        return E_FAIL;
    }  

    IWebBrowser2* s_pFrameWB = NULL;
    IOleCommandTarget* pCmdTarget = NULL;
    HRESULT hr = pUnkSite->QueryInterface(IID_IOleCommandTarget, (LPVOID*)&pCmdTarget);
    if (SUCCEEDED(hr))
    {
        IServiceProvider* pSP;
        hr = pCmdTarget->QueryInterface(IID_IServiceProvider, (LPVOID*)&pSP);

        pCmdTarget->Release();

        if (SUCCEEDED(hr))
        {
            hr = pSP->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (LPVOID*)&s_pFrameWB);
            pSP->Release();
            _ASSERT(s_pFrameWB);
            m_ReflectWnd.GetToolBar().SetBrowser(s_pFrameWB);
            s_pFrameWB->Release();
        }
    }
 }
return S_OK;
   }




  void STDMETHODCALLTYPE CStockBar::OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL)
 {
   // Retrieve the top-level window from the site.
   HWND hwnd;
   HRESULT hr = m_spWebBrowser->get_HWND((LONG_PTR*)&hwnd);
   if (SUCCEEDED(hr))
  {
    // Output a message box when page is loaded.
    MessageBox(hwnd,"Hello World!","BHO", MB_OK);
  }
 }