之前的方法繁琐,这里抄了别人的方法,作了简单修改。记录下。函数
首先要在CHtmlView的子类中,重载以下函数:this
virtual void DocumentComplete(LPDISPATCH pDisp, VARIANT* URL); virtual void NavigateComplete2(LPDISPATCH pDisp, VARIANT* URL);
这2个函数,不是下面的函数:spa
virtual void OnDocumentComplete(VARIANT* URL); virtual void OnNavigateComplete2(VARIANT* URL);
在CHtmlView的子类中,添加一个成员,并在构造函数时初始化为NULL:code
LPDISPATCH m_lpURLDisp;
在NavigateComplete2中记录访问的LPDISPATCH。blog
void CXxxView::NavigateComplete2(LPDISPATCH pDisp, VARIANT* URL) { if ( !m_lpURLDisp ) m_lpURLDisp = pDisp; /* 能够不调用父类的方法, 建议调用。不调用Navigate相关的其余函数可能受到印象 */ CHtmlView::NavigateComplete2(pDisp, URL); }
在DocumentComplete中判断这个DISPATCH。class
void CXxxView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL) { if ( m_lpURLDisp && m_lpURLDisp == pDisp ) { CUtils::DbgView(TEXT("真在完成: %s\n"), (LPCTSTR)(_bstr_t)URL); } /* 不调用父类的方法, 会致使OnDocumentComplete不会触发 */ CHtmlView::DocumentComplete(pDisp, URL); }
在访问URL前,重置m_lpWBDisp成员为NULL。构造函数
void CXxxView::_FreeDISP() { if ( m_lpURLDisp ) m_lpURLDisp->Release(); m_lpURLDisp = NULL; } void CXxxView::Browser(LPCTSTR Url) { this->_FreeDISP(); DWORD dwFlags = navNoHistory; CHtmlView::Navigate2(Url, dwFlags, NULL); }