1 /*============================说明部分=================================
2 实现一下函数需包含头文件
3 #include <Wininet.h>
4 #include <Shlwapi.h>
5 Linker : Wininet.lib Shlwapi.lib
6 =================================================================*/
7 /*========================================END========================================*/
8
9 /*============================说明部分=================================
10 清除指定网页Cookie,注意传参,如:www.baidu.com 要写为:baidu.com
11 =================================================================*/
12 BOOL CleanUrlCache(LPCTSTR lpUrl)
13 {
14 LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL;
15 DWORD dwSize = 0;
16 HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize);
17 if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
18 return FALSE;
19
20 lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];
21 hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize);
22 if (hFind == NULL)
23 {
24 delete lpICEI;
25 return FALSE;
26 }
27
28 do
29 {
30 if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl))
31 {
32 int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName);
33 }
34 delete lpICEI;
35 lpICEI = NULL;
36 dwSize = 0;
37
38 if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
39 break;
40 lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];
41 } while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize));
42
43 if (lpICEI != NULL)
44 delete lpICEI;
45 return TRUE;
46 }
47 /*========================================END========================================*/
48
49
50
51
52 /*============================说明部分=================================
53 清除IE所有Cookie
54 #include <Wininet.h>
55 Linker : Wininet.lib
56 =================================================================*/
57 void ClearInternetCache()
58 {
59 DWORD dwNeeded = 0;
60 FindFirstUrlCacheEntry(NULL, NULL, &dwNeeded);
61
62 if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
63 {
64 unsigned char *buffer = new unsigned char[dwNeeded];
65 try
66 {
67 LPINTERNET_CACHE_ENTRY_INFO lpicei =
68 reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);
69 HANDLE HFind = FindFirstUrlCacheEntry(NULL, lpicei, &dwNeeded);
70 DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);
71
72 bool no_more_files = false;
73 while (!no_more_files)
74 {
75 if (FindNextUrlCacheEntry(HFind, lpicei, &dwNeeded))
76 {
77 DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);
78 }
79 else switch (GetLastError())
80 {
81 case ERROR_INSUFFICIENT_BUFFER:
82 {
83 delete [] buffer;
84 buffer = new unsigned char[dwNeeded];
85 lpicei = reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);
86 break;
87 }
88 default:
89 {
90 no_more_files = true;
91 break;
92 }
93 }
94 }
95 FindCloseUrlCache(HFind);
96 }
97 catch (...)
98 {
99 delete [] buffer;
100 }
101 delete [] buffer;
102 }
103 }
104
105 /*========================================END========================================*/
106
107 /*============================说明部分=================================
108 CString 转换为 VARIANT 类型
109 =================================================================*/
110 StringToVariant(CString str)
111 {
112 VARIANT variant;
113 VariantInit(&variant);
114 variant.vt=VT_BSTR;
115 variant.bstrVal=str.AllocSysString();
116
117 return variant;
118 }
119 /*========================================END========================================*/
120
121 /*============================说明部分=================================
122 打开指定URL,其中m_webBrowser 是web browser
123 控件关联的控件类型的变量
124 =================================================================*/
125 OpenURL(LPCTSTR strURL)
126 {
127 VARIANT vInfo;
128 VariantInit(&vInfo);
129 CString strHeaders=_T("Content-Type:application/x-WWW-form-urlencoded");
130 VARIANT vHeaders=StringToVariant(strHeaders);
131 m_webBrowser.Navigate(strURL,&vInfo,&vInfo,&vInfo,&vHeaders);
132 }
133 /*========================================END========================================*/
134
135
136
137
138 /*============================说明部分=================================
139 向指定ID的HTML标记中输入文字
140 strID为标记的ID值
141 #include <mshtml.h>
142 #include <atlbase.h>
143 =================================================================*/
144 InputText(CString strID, CComVariant strText)
145 {
146 HRESULT hr;
147
148 IDispatch *pDisp;
149 pDisp=m_webBrowser.get_Document(); //得到webBrowser控件接口
150
151 IHTMLDocument2* pDoc;
152 hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口
153
154 IHTMLElementCollection* pColl=NULL;
155 hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合
156
157 IDispatch *pDisp2;
158 VARIANT index;//用于接收返回元素基于的索引,一般不用,设为0就好,而是用IDispatch 接收元素对象接口
159 //V_VT(&index)=VT_I4;
160 //V_I4(&index)=0;
161 index.vt=VT_I4;
162 index.lVal=0;
163
164 VARIANT varID;//要查找的HTML标记ID
165 varID=StringToVariant(strID);
166
167 hr=pColl->item(varID,index,&pDisp2); //找到元素的位置
168 if(S_OK==hr&&NULL!=pDisp2)
169 {
170 IHTMLElement* pElem=NULL;
171 hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);
172
173 if(S_OK==hr&&NULL!=pElem)
174 {
175 pElem->put_innerText(strText.bstrVal);
176 pElem->Release();
177 }
178 pDisp2->Release();
179 pDisp->Release();
180 }
181 }
182 /*========================================END========================================*/
183 /*============================说明部分=================================
184 点击指定ID值的HTML按钮
185 strID是按钮的ID值
186 #include <mshtml.h>
187 #include <atlbase.h>
188 =================================================================*/
189 ClickBtn(CString strID)
190 {
191 HRESULT hr;
192 IDispatch* pDisp;
193 pDisp=m_webBrowser.get_Document();//①得到网页控件接口
194
195 IHTMLDocument2* pDoc;
196 hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);//②得到网页文档接口
197
198 IHTMLElementCollection* pColl=NULL;
199 hr=pDoc->get_all(&pColl);//③得到网页元素记录集合接口
200
201 IDispatch* pDisp2;
202 VARIANT index;
203 //V_VT(&index)=VT_I4;
204 //V_I4(&index)=0;
205 index.vt=VT_I4;
206 index.lVal=0;
207
208 VARIANT varID;
209 varID=StringToVariant(strID);
210
211 hr=pColl->item(varID,index,&pDisp2);//④得到指定HTML标记接口
212
213 if(S_OK==hr&&NULL!=pDisp2)
214 {
215 IHTMLElement* pElem=NULL;
216 hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);//⑤得到确定元素接口
217
218 if(S_OK==hr&&NULL!=pElem)
219 {
220 pElem->click();
221 pElem->Release();
222 }
223 pDisp2->Release();
224 pDisp->Release();
225 }
226 }
227 /*========================================END========================================*/
228 /*===============================================================
229 根据页面Class属性值点击页面元素
230 =================================================================*/
231 void CPiLiangQianDaoDlg::ClickByClassName()
232 {
233 IHTMLElementCollection *objAllElement=NULL;
234 IHTMLDocument2 *objDocument=NULL;
235
236 objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();
237 //由控件得到IHTMLDocument2接口指针
238
239 objDocument-> get_all(&objAllElement); //得到网页所有元素的集合
240
241 IHTMLElement * pElem = NULL;
242 VARIANT name;
243 CComBSTR tag;
244 long a;
245 objAllElement-> get_length(&a);
246 name.vt=VT_I4;
247 for(int i=0;i <a;i++)//遍历所有元素
248 {
249 name.lVal = i;
250 IDispatch * pDispatch=NULL;
251 objAllElement-> item(name,name,&pDispatch);
252 IHTMLElement* spElement;
253 pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
254 BSTR tag;
255 spElement->get_className(&tag);
256 CString ss(tag);
257 if(ss == "j_signbtn sign_btn2 j_cansign sign0" || ss == "j_signbtn sign_btn2 j_cansign sign1" || ss == "j_signbtn sign_btn2 j_cansign sign6")
258 spElement-> click();
259 }
260 /*=====================================================================================*/
261 /*=====================================================================================
262 根据网页打开的进程设置进度条
263 给web browser添加OnProgressChange响应函数
264 m_procCtrl是进度条关联的控件变量
265 =======================================================================*/
266 if(ProgressMax>0)
267 m_procCtrl.SetPos(100*Progress / ProgressMax);
268 //========================================
269
270 /*====================================================================
271 搜索点击页面文字连接
272 Str为文字
273 =======================================================================*/
274 ClickItem(CString str)
275 {
276 IHTMLElementCollection *objAllElement=NULL;
277 IHTMLDocument2 *objDocument=NULL;
278
279 objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();
280 //由控件得到IHTMLDocument2接口指针
281
282 objDocument-> get_all(&objAllElement); //得到网页所有元素的集合
283
284 IHTMLElement * pElem = NULL;
285 VARIANT name;
286 CComBSTR tag;
287 long a;
288 objAllElement-> get_length(&a);
289 name.vt=VT_I4;
290 for(int i=0;i <a;i++)//遍历所有元素
291 {
292 name.lVal = i;
293 IDispatch * pDispatch=NULL;
294 objAllElement-> item(name,name,&pDispatch);
295 IHTMLElement* spElement;
296 pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
297 BSTR tag;
298 spElement-> get_outerText(&tag);
299 CString ss(tag);
300 if(ss=="地图")
301 spElement-> click();
302 }
303 }
304 /*=====================================================================================*/
305 /*=======================================================================================
306 在DocumentCompleteExplorer判断是否为主框架加载完毕
307 在页面中有多个框架时会多次触发,可能导致页面中后面的“首页”链接得不到,可以在void CTest2Dlg::OnDownloadCompleteExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL)
308 加入下面代码:
309 ======================================================================================*/CComQIPtr <IWebBrowser2, &IID_IWebBrowser2> pWeb; CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2> pDoc2; pWeb = pDisp; pWeb-> get_Document((IDispatch**)&pDoc2); if (m_ie.GetDocument() != pDoc2) return;
310 /*==========================================================================*/
311
312
313 /*======================================================================
314 判断网页是否加载完毕
315 ========================================================================*/
316 void CPiLiangQianDaoDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)
317 {
318 // TODO: 在此处添加消息处理程序代码
319 if(m_webBrowser.get_ReadyState() == READYSTATE_COMPLETE && times == 0)
320 {
321 ((CListBox *)GetDlgItem(IDC_LIST_STATE))->AddString(_T("加载完毕!"));
322 m_IsInitDone = 1;
323 times++;
324 }
325 }
326 /*======================================================================================
327 截取网页部分内容,并画图显示
328 ======================================================================================*/
329 {
330 CClientDC hImageDC(GetDlgItem(IDC_EDIT_INFO));
331
332 HRESULT hr;
333
334 IDispatch *pDisp;
335 pDisp=m_webBrowser.get_Document(); //得到webBrowser控件接口
336
337 IHTMLDocument2* pDoc;
338 hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口
339
340 IHTMLElementCollection* pColl=NULL;
341 hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合
342
343 IDispatch *pDisp2;
344 VARIANT index;//用于接收返回元素基于的索引,一般不用,设为就好,而是用IDispatch 接收元素对象接口
345 //V_VT(&index)=VT_I4;
346 //V_I4(&index)=0;
347 index.vt=VT_I4;
348 index.lVal=0;
349
350 VARIANT varID;//要查找的HTML标记ID
351 varID=StringToVariant(_T("userlike_info_head_img"));
352
353 hr=pColl->item(varID,index,&pDisp2); //找到元素的位置
354 if(S_OK==hr&&NULL!=pDisp2)
355 {
356 IHTMLElement3* pElem=NULL;
357 hr=pDisp2->QueryInterface(IID_IHTMLElement3,(void**)&pElem);
358 IHTMLElementRender *pRender = NULL;
359 pElem ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);
360 pRender->DrawToDC(hImageDC);
361 }
362 }
363 /*=================================================================================*/
364
365 /*=================================================================================
366 判断网页是否加在完全(包含框架)
367 原理:如果直接早DocummentComple里判断的话,包含多个框架(frame)的网页就会多次激发该函数。所以这里我们这里通过pDish判断是不是主框架的的借口(最后调用该函数),如果是的话就是最后一次激发,表示主框架家在完毕,也就是整个网页加载完毕!
368 =====================================================================================*/
369 void CTieBaGuajiDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
370 {
371 // TODO: 在此处添加消息处理程序代码
372 CComQIPtr <IWebBrowser2, &IID_IWebBrowser2> pWeb;
373 CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2> pDoc2;
374 pWeb = pDisp;
375 pWeb-> get_Document((IDispatch**)&pDoc2);
376 if (m_webBrowser.get_Document() == pDoc2)
377 {
378 ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));
379 }
380 /////////////////////////////////////////
381 /*if(0==m_count)
382 {
383 ((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));
384 m_count++;
385 }*/
386 }
387 /*=============================================================================*/
388 /*==============================================================================
389 另外如果不想让webbrowser空间弹出错误提示可以,在对空间资源编辑时设置Slient为TRUE
390 ==============================================================================*/