如果在系统中打开了活动桌面,BHO 也能随同 Windows Explorer 一起启动。如果不想在
Windows Explorer 中运行 BHO,可将如下代码添加到 DLLMain 中:
TCHAR strLoader[MAX_PATH];
::GetModuleFileName (NULL, strLoader, MAX_PATH);
if(stricmp("explorer.exe", strLoader) == 0)
return FALSE;
BHO 的 COM Server 必须实现 IObjectWithSite,以便对象可以挂钩到浏览器事件,Inter
net Explorer 会依靠 IObjectWithSite 将一个指针传递到它的 IUnknown 接口,所以,只需
实现 IObjectWithSite 的 SetSite 方法就行了,如下所示:
STDMETHODIMP CBhoApp::SetSite(IUnknown *pUnkSite)
{
//获取并存储 IWebBrowser2 指针
m_spWebBrowser2 = pUnkSite;
if (m_spWebBrowser2 == NULL)
return E_INVALIDARG;
//获取并存储 IConnectionPointerContainer 指针
m_spCPC = m_spWebBrowser2;
if (m_spCPC == NULL)
return E_POINTER;
//连接到宿主程序以接收事件通知
return Connect();
}
以下是 Connect 函数比较简单的实现:
HRESULT CBhoApp::Connect()
{
HRESULT hr;
CComPtr<IConnectionPoint> spCP;
//获取访问 WebBrowser 事件的连接指针
hr = m_spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP);
if (FAILED(hr))
return hr;
//把事件处理程序传递给宿主程序 Each time an event
//每次有事件产生时,宿主程序都会调用我们实现的 IDispatch 接口的函数
hr = spCP->Advise(reinterpret_cast<IDispatch*>(this),&m_dwCookie);