Esempio n. 1
0
// 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);
}