读书人

TCppWebBrowser-怎样判断页面装载完成

发布时间: 2012-02-25 10:01:47 作者: rapoo

TCppWebBrowser-怎样判断页面装载完成
OnDocumentComplete()在打开一个multi-frame的网页是会执行多次,怎么样才能判断是打开top-level的frame,也就是整个网页完全装载完成?

网上也查了一些资料,但是还是没有成功。具体的解决方法有如下几种:
1. Msdn:
void CMyClass::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
HRESULT hr;
IUnknown* pUnkBrowser = NULL;
IUnknown* pUnkDisp = NULL;
IDispatch* pDocDisp = NULL;
IHTMLDocument2* pDoc = NULL;

// Is this the DocumentComplete event for the top frame window?
// Check COM identity: compare IUnknown interface pointers.
hr = m_pBrowser->QueryInterface(IID_IUnknown, (void**)&pUnkBrowser);

if (SUCCEEDED(hr))
{
hr = pDisp->QueryInterface(IID_IUnknown, (void**)&pUnkDisp);

if (SUCCEEDED(hr))
{
if (pUnkBrowser == pUnkDisp)
{
// This is the DocumentComplete event for the top frame.
// This page is loaded, so we can access the DHTML Object Model.
hr = m_pBrowser->get_Document(&pDocDisp);

if (SUCCEEDED(hr))
{
// Obtained the document object.
pDocDisp->QueryInterface(IID_IHTMLDocument2, (void**)&pDoc);
if (SUCCEEDED(hr))
{
// Obtained the IHTMLDocument2 interface for the document object
ProcessDocument(pDoc);
}

pDocDisp->Release();
}
}

pUnkDisp->Release();
}

pUnkBrowser->Release();
}
}
每次我对pDoc进行处理时都会有Access Violation的错误信息,感觉是不是网页还没有被下载下来。
如果在整段代码前面加上if (!CppWebBrowser1->Busy && CppWebBrowser1->Document &&
AnsiString(CppWebBrowser1->LocationURL) != "about:blank"),每次都执行不到ProcessDocument(pDoc)。可能是pUnkBrowser 不等于pUnkDisp的原因

2. MS Help文件(类似的代码可以从bcb6 help文件中找到)

LPDISPATCH glpDisp = NULL; // global LPDISPATCH, can also
// be of class scope

// NavigateComplete2 event
void CWebbrDlg::OnNavigateComplete2Explorer1(LPDISPATCH pDisp,
VARIANT FAR* URL)
{
// Check if glpDisp is NULL. If NULL, that means it is
// the top level NavigateComplete2. Save the LPDISPATCH
if (!glpDisp)
glpDisp = pDisp;
}

void CWebbrDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp,
VARIANT FAR* URL)
{
if (glpDisp && glpDisp == pDisp)
{
// if the LPDISPATCH are same, that means
// it is the final DocumentComplete. Reset glpDisp
TRACE("Document is done downloading");
glpDisp = NULL;
}
}
但是每次我的NavigateComplete2()函数都不执行,网页其实已经完全装载完毕,除非我点击一下已经打开的页面上的某个链接,这时该函数才会执行。

3. 用OnProgressChange():
Progress = -1当网页完全装载时,但是我从来没得到-1这个值

哪个大哥详细的解答一下,非常感谢!!!


[解决办法]
刚才又试了一下,2007可以,2009不行。但是2009下用TWebBrowser可以。
测试的代码:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WebBrowser1->Navigate(L"http://www.xcar.com.cn");
}
//---------------------------------------
void __fastcall TForm1::WebBrowser1DocumentComplete(TObject *ASender, const IDispatch *pDisp,
OleVariant &URL)
{
Memo1->Lines->Add("d"); //每次触发的Complete
if(pDisp==WebBrowser1->DefaultInterface) // TWebBrowser用DefaultInterface或DefaultDispatch都正常
{
Memo1->Lines->Add("end"); //最后触发的Complete
}
}

具体什么原因我也不清楚,这个方法也是很久以前从网上查的,就是判断一下触发DocumentComplete的是哪个窗口。

读书人网 >C++ Builder

热点推荐