以前的方法繁琐,这里抄了别人的方法,做了简单修改。记录下。
首先要在CHtmlView的子类中,重载如下函数:
virtual void DocumentComplete(LPDISPATCH pDisp, VARIANT* URL); virtual void NavigateComplete2(LPDISPATCH pDisp, VARIANT* URL);
这2个函数,不是下面的函数:
virtual void OnDocumentComplete(VARIANT* URL); virtual void OnNavigateComplete2(VARIANT* URL);
在CHtmlView的子类中,添加一个成员,并在构造函数时初始化为NULL:
LPDISPATCH m_lpURLDisp;
在NavigateComplete2中记录访问的LPDISPATCH。
void CXxxView::NavigateComplete2(LPDISPATCH pDisp, VARIANT* URL) { if ( !m_lpURLDisp ) m_lpURLDisp = pDisp; /* 可以不调用父类的方法, 建议调用。不调用Navigate相关的其他函数可能受到印象 */ CHtmlView::NavigateComplete2(pDisp, URL); }
在DocumentComplete中判断这个DISPATCH。
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); }