// CXRefreshBHO STDMETHODIMP CXRefreshBHO::SetSite(IUnknown* pUnkSite) { WATCH_EXITS; DTI(TRACE_I(FS(_T("BHO[%08X]: SetSite(%08X)"), this, pUnkSite))); if (pUnkSite != NULL) { // cache the pointer to IWebBrowser2 pUnkSite->QueryInterface(IID_IWebBrowser2, (void **)&m_Browser); // register to sink events from DWebBrowserEvents2 DispEventAdvise(m_Browser); m_IsAdvised = true; // allocate browser id BrowserManagerLock browserManager; m_BrowserId = browserManager->AllocBrowserId(m_Browser, this); m_Logger.m_BrowserId = m_BrowserId; ATLASSERT(m_BrowserId!=NULL_BROWSER); HWND hwnd; HRESULT hr = m_Browser->get_HWND((LONG_PTR*)&hwnd); if (SUCCEEDED(hr)) { m_IE7ToolWindow.TryToIntegrate(hwnd); } m_ConnectionManager.Connect(); } else { m_ConnectionManager.StopReconnectListener(); m_ConnectionManager.Disconnect(); m_IE7ToolWindow.DetachFromIE(); // unregister event sink. if (m_IsAdvised) { DispEventUnadvise(m_Browser); m_IsAdvised = false; } BrowserManagerLock browserManager; CBrowserMessageWindow* bw = browserManager->FindBrowserMessageWindow(m_BrowserId); ATLASSERT(bw); bw->SetBHO(NULL); browserManager->ReleaseBrowserId(m_BrowserId); m_BrowserId = NULL_BROWSER; m_Logger.m_BrowserId = NULL_BROWSER; // release cached pointers and other resources here. m_Browser = NULL; } SendInfoAboutPage(); // Call base class implementation. return IObjectWithSiteImpl<CXRefreshBHO>::SetSite(pUnkSite); }