IE浏览器网页网址监控

来源:互联网 发布:ddos网页端源码 编辑:程序博客网 时间:2024/04/29 15:34

/***************************************************

第一次写博客 害羞

**************************************************/

工作中遇到了个网页监控的任务,从网上找了个例子,改了下,实现了网页网址监控及网页元素获取(功能是实现了,但是还是有很多不明白的地方,主要是用到com技术的地方不明白,有时间得学学com-_-!);


使用的是浏览器拓展而不是浏览器插件;


新建一个VS ATL工程,然后添加ATL类 :COM 1.0组件;


需要实现com的两个接口:

STDMETHOD(SetSite)(IUnknown *pUnkSite);STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS * pDispParams, VARIANT * pvarResult,EXCEPINFO * pexcepinfo,UINT * puArgErr);
</pre><pre name="code" class="cpp">在类的基类继承添加:
<pre name="code" class="cpp">public IObjectWithSiteImpl<CExplorerBHO>,public IDispEventImpl<1, CExplorerBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
</pre><pre name="code" class="cpp">头文件中还需添加以下类容:
<pre name="code" class="cpp">BEGIN_COM_MAP(CExplorerBHO)COM_INTERFACE_ENTRY(IExplorerBHO)COM_INTERFACE_ENTRY(IDispatch)COM_INTERFACE_ENTRY(IObjectWithSite)END_COM_MAP()
</pre><pre name="code" class="cpp"><pre name="code" class="cpp">////////不晓得为啥,这个必须要加,不加编译不过-_-!BEGIN_SINK_MAP(CExplorerBHO)  END_SINK_MAP()
</pre><pre name="code" class="cpp"><pre name="code" class="cpp">CComPtr<IWebBrowser2>  m_spWebBrowser;  BOOL m_fAdvised; 
</pre><pre name="code" class="cpp">
</pre>以下是实现文件:
<pre name="code" class="cpp">STDMETHODIMP CExplorerBHO::SetSite(IUnknown* pUnkSite)  {  static bool isinit;if (!isinit){isinit = true;initURL();}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  {  // Unregister event sink.  if (m_fAdvised)  {  DispEventUnadvise(m_spWebBrowser);  m_fAdvised = FALSE;  }  // Release cached pointers and other resources here.  m_spWebBrowser.Release();  }  // Call base class implementation.  return IObjectWithSiteImpl<CExplorerBHO>::SetSite(pUnkSite);  }  STDMETHODIMP CExplorerBHO::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,DISPPARAMS* pDispParams, VARIANT* pvarResult,EXCEPINFO*  pExcepInfo,  UINT* puArgErr){USES_CONVERSION;if (!pDispParams)return E_INVALIDARG; switch (dispidMember){//// The parameters for this DISPID are as follows:// [0]: Cancel flag - VT_BYREF|VT_BOOL// [1]: HTTP headers - VT_BYREF|VT_VARIANT// [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT // [3]: Target frame name - VT_BYREF|VT_VARIANT // [4]: Option flags - VT_BYREF|VT_VARIANT// [5]: URL to navigate to - VT_BYREF|VT_VARIANT// [6]: An object that evaluates to the top-level or frame// WebBrowser object corresponding to the event. //case DISPID_BEFORENAVIGATE2:{
<span style="white-space:pre"></span>//////网页加载前会收到这个消息,可以在里面监控网址LPOLESTR lpURL = NULL;m_spWebBrowser->get_LocationURL(&lpURL);char * strurl;if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT)){CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);varURL.ChangeType(VT_BSTR);strurl = OLE2A(varURL.bstrVal);OutputDebugString(L"打开的网址:");OutputDebugString(A2W(strurl));OutputDebugString(L"\r\n");}} break;default:break;}//return S_OK;return IDispatchImpl<IExplorerBHO, &IID_IExplorerBHO, &LIBID_Se_IExplorerBHOLib, /*wMajor =*/ 1, /*wMinor =*/ 0>::Invoke(dispidMember, riid, lcid, wFlags,pDispParams, pvarResult, pExcepInfo, puArgErr);}
代码码完后,修改*.rgs文件(注:要将uuid改为你自己的uuid):
HKLM {    NoRemove SOFTWARE {      NoRemove Microsoft {           NoRemove Windows {          NoRemove CurrentVersion {            NoRemove Explorer {              NoRemove 'Browser Helper Objects' {                ForceRemove '{029C996B-5A32-4FB3-A2BB-BDD04677FC2B}' = s 'HelloWorldBDO' {                  val 'NoExplorer' = d '1'                }              }            }          }        }      }    }  }
OK,编译后会自动注册dll的。浏览器一启动就会加载该dll。
稍后我会将源码上传,供大家下载。


</pre><pre name="code" class="cpp">









0 0