天天看點

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. }