天天看点

VC6重载BeforeNavigate2和DocumentComplete函数方法 .

众所周知BeforeNavigate2和DocumentComplete函数是IE未公开的接口,如果你做基于IE的二次开发的话,而且很不幸因为种种原因只能用VC6的话,那么本文将帮助你,告诉你如何正确识别网页下载完毕以及在网页未下载完成的时候正确识别真正的url

重载这两个函数的方法是:

第一步

在chtmlxxxview.h文件添加

    void DocumentComplete(LPDISPATCH pDisp,VARIANT *URL);

    void BeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel);

以及

    DECLARE_EVENTSINK_MAP()

第二步:

在CPP文件添加

END_MESSAGE_MAP()

BEGIN_EVENTSINK_MAP(CTyreaderView,CHtmlView)

ON_EVENT(CHtmlView,   AFX_IDW_PANE_FIRST,   259   ,   DocumentComplete,   VTS_DISPATCH   VTS_PVARIANT)

ON_EVENT(CHtmlView, AFX_IDW_PANE_FIRST, 250,BeforeNavigate2,VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)

END_EVENTSINK_MAP()

第三部:

在CPP文件天津爱函数实体

[cpp] view plain copy print ?

  1. void CTyreaderView::BeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)  
  2. {  
  3.             IDispatchPtr       spDisp;  
  4.             HRESULT             hr;  
  5.             CString             url;  
  6.             CString             CurUrl = CString(m_curPath);  
  7.             hr   =   m_pBrowserApp->QueryInterface(IID_IDispatch,(void**)&spDisp);  
  8.         //  m_pBrowserApp->Release();   
  9.       //   Is   the   IDispatch*   passed   to   us   for   the   top-level   window   ?   
  10.       m_IsDown = 0;  
  11.       if(pDisp ==  spDisp)  
  12.             {  
  13.                 url = VariantToString(*URL);  
  14.                 if(url == CurUrl)  
  15.                 {  
  16.                 }  
  17.                 else  
  18.                 {  
  19.                         m_url = url;          
  20.                         if(1 == m_ReadMode) OnReadAuthor();   
  21.                 }  
  22.             }         
  23. }  
void CTyreaderView::BeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
{
			IDispatchPtr       spDisp;
			HRESULT             hr;
			CString             url;
			CString             CurUrl = CString(m_curPath);
			hr   =   m_pBrowserApp->QueryInterface(IID_IDispatch,(void**)&spDisp);
		//	m_pBrowserApp->Release();
      //   Is   the   IDispatch*   passed   to   us   for   the   top-level   window   ?
      m_IsDown = 0;
      if(pDisp ==  spDisp)
			{
				url = VariantToString(*URL);
				if(url == CurUrl)
				{

				}
				else
				{
						m_url = url;		
						if(1 == m_ReadMode) OnReadAuthor();	
				}
			}		
}
           

[cpp] view plain copy print ?

  1. void   CTyreaderView::DocumentComplete(LPDISPATCH   pDisp,   VARIANT*   URL)  
  2. {  
  3.             IDispatchPtr       spDisp;  
  4.             HRESULT             hr;  
  5.             CString             url;  
  6.             CString             CurUrl = CString(m_curPath);  
  7.             hr   =   m_pBrowserApp->QueryInterface(IID_IDispatch,(void**)&spDisp);  
  8.             m_pBrowserApp->Release();  
  9.       //   Is   the   IDispatch*   passed   to   us   for   the   top-level   window   ?   
  10.       if(pDisp   ==   spDisp)  
  11.             {  
  12.                 url = VariantToString(*URL);  
  13.                 m_IsDown = 1;  
  14.             }  
  15.         //  m_pBrowserApp->Release();   
  16. }