28,390
社区成员
发帖
与我相关
我的任务
分享
str_text = bstr;
后面,一定要加上这句
SysFreeString(bstr);
VARIANT flag;
flag.vt = VT_I4;
flag.iVal = navNoHistory | navNoReadFromCache | navNoWriteToCache;
m_browser.Navigate(m_url, &flag, NULL, NULL, NULL);
m_browser.put_Silent(TRUE);
MSG msg;
DWORD dwTimeStarted = ::GetTickCount();
for (int i = 0; i != 3; ++i)
{
while (1000 > ::GetTickCount() - dwTimeStarted)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
BSTR bstr;
HRESULT hResult = S_OK;
IHTMLElement* pElement1 = NULL;
IHTMLElement* pElement2 = NULL;
IHTMLDocument2* pDoc = (IHTMLDocument2*)m_browser.get_Document();
if (NULL != pDoc)
{
hResult = pDoc->get_body(&pElement1);
if (S_OK == hResult && NULL != pElement1)
{
hResult = pElement1->get_parentElement(&pElement2);
if (S_OK == hResult && NULL != pElement2)
{
hResult = pElement2->get_outerHTML(&bstr);
if (S_OK == hResult)
{
pDoc->Release();
pDoc = NULL;
pElement1->Release();
pElement1 = NULL;
pElement2->Release();
pElement2 = NULL;
}
}
}
}
else
{
if (NULL != pDoc)
{
pDoc->Release();
pDoc = NULL;
}
if (NULL != pElement1)
{
pElement1->Release();
pElement1 = NULL;
}
if (NULL != pElement2)
{
pElement2->Release();
pElement2 = NULL;
}
return;
}
str_text = bstr;
如果执行成功,str_text就是m_url对应网页源代码,并且包含了ajax内容。
注意:
1、一定要执行
pDoc->Release();
pDoc = NULL;
pElement1->Release();
pElement1 = NULL;
pElement2->Release();
pElement2 = NULL;
否则每次执行m_browser.Navigate(....)后,都会有严重的内存泄漏!!!
2、一定要在m_browser.Navigate(....)后让程序暂时执行一小段时间(比如3秒、4秒、5秒),这是因为Navigate()函数会立即返回,同时Web Browser控件才开始加载网页,接着代码会向下执行,如果不预留足够的时间,有非常大的概率导致m_browser.get_Document()执行失败,也就无法获取网页源代码。而代码段
MSG msg;
DWORD dwTimeStarted = ::GetTickCount();
for (int i = 0; i != 3; ++i)
{
while (1000 > ::GetTickCount() - dwTimeStarted)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
就是让程序暂停执行了大约3秒钟。更多有关该代码段,请搜索关键词“VC版DoEvents”。该代码段有两个缺点:在暂停时间内程序占用的CPU资源会升高很多、在暂停时间内导致程序不执行代码块BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)。
3、用定时器也可以达到让程序暂停执行一小段时间的效果,并且没有上述两个缺点。如何使用定时器,请搜索网上的教程。