IE浏览器网页网址监控

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

第一次写博客 害羞

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

工作中遇到了个网页监控的任务,从网上找了个例子,改了下,实现了网页网址监控及网页元素获取(功能是实现了,但是还是有很多不明白的地方,主要是用到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">











发布了1 篇原创文章 · 获赞 3 · 访问量 643
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览