假設m_browser是CWebBrowser2類型的變量,m_url是包含有ajax內容的網址,str_text是CString變量,執(zhí)行如下代碼
C/C++ code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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;
如果執(zhí)行成功,str_text就是m_url對應網頁源代碼,并且包含了ajax內容。
注意:
1、一定要執(zhí)行
C/C++ code
1
2
pDoc->Release();
pDoc = NULL;
C/C++ code
1
2
pElement1->Release();
pElement1 = NULL;
C/C++ code
1
2
pElement2->Release();
pElement2 = NULL;
否則每次執(zhí)行m_browser.Navigate(....)后,都會有嚴重的內存泄漏?。?!
2、一定要在m_browser.Navigate(....)后讓程序暫時執(zhí)行一小段時間(比如3秒、4秒、5秒),這是因為Navigate()函數會立即返回,同時Web Browser控件才開始加載網頁,接著代碼會向下執(zhí)行,如果不預留足夠的時間,有非常大的概率導致m_browser.get_Document()執(zhí)行失敗,也就無法獲取網頁源代碼。而代碼段
C/C++ code
1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}
}
}
就是讓程序暫停執(zhí)行了大約3秒鐘。更多有關該代碼段,請搜索關鍵詞“VC版DoEvents”。該代碼段有兩個缺點:在暫停時間內程序占用的CPU資源會升高很多、在暫停時間內導致程序不執(zhí)行代碼塊BOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)。
3、用定時器也可以達到讓程序暫停執(zhí)行一小段時間的效果,并且沒有上述兩個缺點。如何使用定時器,請搜索網上的教程。
對我有用[0] 丟個板磚[0] 引用 |
舉報 | 管理
關注oo2461166893oo2461166893
本版等級:
#11 得分:0回復于: 2014-05-29 09:21:15
引用 9 樓 zengshirong 的回復:可以分享下么,在VC++中使用Web Browser控件編程實現獲取ajax內容的方法?
上面漏了一句代碼,在
C/C++ code
1
str_text = bstr;
后面,一定要加上這句
C/C++ code
1
SysFreeString(bstr);