/*============================说明部分=================================
实现一下函数需包含头文件
#include <Wininet.h>
#include <Shlwapi.h>
Linker : Wininet.lib Shlwapi.lib
=================================================================*/
/*========================================END========================================*/ /*============================说明部分=================================
清除指定网页Cookie,注意传参,如:www.baidu.com 要写为:baidu.com
=================================================================*/
BOOL CleanUrlCache(LPCTSTR lpUrl)
{
LPINTERNET_CACHE_ENTRY_INFO lpICEI = NULL;
DWORD dwSize = ;
HANDLE hFind = FindFirstUrlCacheEntry(NULL, NULL, &dwSize);
if (hFind == NULL && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
return FALSE; lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];
hFind = FindFirstUrlCacheEntry(NULL, lpICEI, &dwSize);
if (hFind == NULL)
{
delete lpICEI;
return FALSE;
} do
{
if (StrStrI(lpICEI->lpszSourceUrlName, lpUrl))
{
int bRet = DeleteUrlCacheEntry(lpICEI->lpszSourceUrlName);
}
delete lpICEI;
lpICEI = NULL;
dwSize = ; if (!FindNextUrlCacheEntry(hFind, NULL, &dwSize) && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
break;
lpICEI = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwSize];
} while (FindNextUrlCacheEntry(hFind, lpICEI, &dwSize)); if (lpICEI != NULL)
delete lpICEI;
return TRUE;
}
/*========================================END========================================*/ /*============================说明部分=================================
清除IE所有Cookie
#include <Wininet.h>
Linker : Wininet.lib
=================================================================*/
void ClearInternetCache()
{
DWORD dwNeeded = ;
FindFirstUrlCacheEntry(NULL, NULL, &dwNeeded); if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
unsigned char *buffer = new unsigned char[dwNeeded];
try
{
LPINTERNET_CACHE_ENTRY_INFO lpicei =
reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);
HANDLE HFind = FindFirstUrlCacheEntry(NULL, lpicei, &dwNeeded);
DeleteUrlCacheEntry(lpicei->lpszSourceUrlName); bool no_more_files = false;
while (!no_more_files)
{
if (FindNextUrlCacheEntry(HFind, lpicei, &dwNeeded))
{
DeleteUrlCacheEntry(lpicei->lpszSourceUrlName);
}
else switch (GetLastError())
{
case ERROR_INSUFFICIENT_BUFFER:
{
delete [] buffer;
buffer = new unsigned char[dwNeeded];
lpicei = reinterpret_cast<LPINTERNET_CACHE_ENTRY_INFO>(buffer);
break;
}
default:
{
no_more_files = true;
break;
}
}
}
FindCloseUrlCache(HFind);
}
catch (...)
{
delete [] buffer;
}
delete [] buffer;
}
} /*========================================END========================================*/ /*============================说明部分=================================
CString 转换为 VARIANT 类型
=================================================================*/
StringToVariant(CString str)
{
VARIANT variant;
VariantInit(&variant);
variant.vt=VT_BSTR;
variant.bstrVal=str.AllocSysString(); return variant;
}
/*========================================END========================================*/ /*============================说明部分=================================
打开指定URL,其中m_webBrowser 是web browser
控件关联的控件类型的变量
=================================================================*/
OpenURL(LPCTSTR strURL)
{
VARIANT vInfo;
VariantInit(&vInfo);
CString strHeaders=_T("Content-Type:application/x-WWW-form-urlencoded");
VARIANT vHeaders=StringToVariant(strHeaders);
m_webBrowser.Navigate(strURL,&vInfo,&vInfo,&vInfo,&vHeaders);
}
/*========================================END========================================*/ /*============================说明部分=================================
向指定ID的HTML标记中输入文字
strID为标记的ID值
#include <mshtml.h>
#include <atlbase.h>
=================================================================*/
InputText(CString strID, CComVariant strText)
{
HRESULT hr; IDispatch *pDisp;
pDisp=m_webBrowser.get_Document(); //得到webBrowser控件接口 IHTMLDocument2* pDoc;
hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口 IHTMLElementCollection* pColl=NULL;
hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合 IDispatch *pDisp2;
VARIANT index;//用于接收返回元素基于的索引,一般不用,设为0就好,而是用IDispatch 接收元素对象接口
//V_VT(&index)=VT_I4;
//V_I4(&index)=0;
index.vt=VT_I4;
index.lVal=; VARIANT varID;//要查找的HTML标记ID
varID=StringToVariant(strID); hr=pColl->item(varID,index,&pDisp2); //找到元素的位置
if(S_OK==hr&&NULL!=pDisp2)
{
IHTMLElement* pElem=NULL;
hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem); if(S_OK==hr&&NULL!=pElem)
{
pElem->put_innerText(strText.bstrVal);
pElem->Release();
}
pDisp2->Release();
pDisp->Release();
}
}
/*========================================END========================================*/
/*============================说明部分=================================
点击指定ID值的HTML按钮
strID是按钮的ID值
#include <mshtml.h>
#include <atlbase.h>
=================================================================*/
ClickBtn(CString strID)
{
HRESULT hr;
IDispatch* pDisp;
pDisp=m_webBrowser.get_Document();//①得到网页控件接口 IHTMLDocument2* pDoc;
hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);//②得到网页文档接口 IHTMLElementCollection* pColl=NULL;
hr=pDoc->get_all(&pColl);//③得到网页元素记录集合接口 IDispatch* pDisp2;
VARIANT index;
//V_VT(&index)=VT_I4;
//V_I4(&index)=0;
index.vt=VT_I4;
index.lVal=; VARIANT varID;
varID=StringToVariant(strID); hr=pColl->item(varID,index,&pDisp2);//④得到指定HTML标记接口 if(S_OK==hr&&NULL!=pDisp2)
{
IHTMLElement* pElem=NULL;
hr=pDisp2->QueryInterface(IID_IHTMLElement,(void**)&pElem);//⑤得到确定元素接口 if(S_OK==hr&&NULL!=pElem)
{
pElem->click();
pElem->Release();
}
pDisp2->Release();
pDisp->Release();
}
}
/*========================================END========================================*/
/*===============================================================
根据页面Class属性值点击页面元素
=================================================================*/
void CPiLiangQianDaoDlg::ClickByClassName()
{
IHTMLElementCollection *objAllElement=NULL;
IHTMLDocument2 *objDocument=NULL; objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();
//由控件得到IHTMLDocument2接口指针 objDocument-> get_all(&objAllElement); //得到网页所有元素的集合 IHTMLElement * pElem = NULL;
VARIANT name;
CComBSTR tag;
long a;
objAllElement-> get_length(&a);
name.vt=VT_I4;
for(int i=;i <a;i++)//遍历所有元素
{
name.lVal = i;
IDispatch * pDispatch=NULL;
objAllElement-> item(name,name,&pDispatch);
IHTMLElement* spElement;
pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
BSTR tag;
spElement->get_className(&tag);
CString ss(tag);
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")
spElement-> click();
}
/*=====================================================================================*/
/*=====================================================================================
根据网页打开的进程设置进度条
给web browser添加OnProgressChange响应函数
m_procCtrl是进度条关联的控件变量
=======================================================================*/
if(ProgressMax>)
m_procCtrl.SetPos(*Progress / ProgressMax);
//======================================== /*====================================================================
搜索点击页面文字连接
Str为文字
=======================================================================*/
ClickItem(CString str)
{
IHTMLElementCollection *objAllElement=NULL;
IHTMLDocument2 *objDocument=NULL; objDocument=(IHTMLDocument2 *)m_webBrowser.get_Document();
//由控件得到IHTMLDocument2接口指针 objDocument-> get_all(&objAllElement); //得到网页所有元素的集合 IHTMLElement * pElem = NULL;
VARIANT name;
CComBSTR tag;
long a;
objAllElement-> get_length(&a);
name.vt=VT_I4;
for(int i=;i <a;i++)//遍历所有元素
{
name.lVal = i;
IDispatch * pDispatch=NULL;
objAllElement-> item(name,name,&pDispatch);
IHTMLElement* spElement;
pDispatch-> QueryInterface(IID_IHTMLElement, (void**)&spElement);
BSTR tag;
spElement-> get_outerText(&tag);
CString ss(tag);
if(ss=="地图")
spElement-> click();
}
}
/*=====================================================================================*/
/*=======================================================================================
在DocumentCompleteExplorer判断是否为主框架加载完毕
在页面中有多个框架时会多次触发,可能导致页面中后面的“首页”链接得不到,可以在void CTest2Dlg::OnDownloadCompleteExplorer1(LPDISPATCH pDisp, VARIANT FAR* URL)
加入下面代码:
======================================================================================*/CComQIPtr <IWebBrowser2, &IID_IWebBrowser2> pWeb; CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2> pDoc2; pWeb = pDisp; pWeb-> get_Document((IDispatch**)&pDoc2); if (m_ie.GetDocument() != pDoc2) return;
/*==========================================================================*/ /*======================================================================
判断网页是否加载完毕
========================================================================*/
void CPiLiangQianDaoDlg::DocumentCompleteExplorer(LPDISPATCH pDisp, VARIANT* URL)
{
// TODO: 在此处添加消息处理程序代码
if(m_webBrowser.get_ReadyState() == READYSTATE_COMPLETE && times == )
{
((CListBox *)GetDlgItem(IDC_LIST_STATE))->AddString(_T("加载完毕!"));
m_IsInitDone = ;
times++;
}
}
/*======================================================================================
截取网页部分内容,并画图显示
======================================================================================*/
{
CClientDC hImageDC(GetDlgItem(IDC_EDIT_INFO)); HRESULT hr; IDispatch *pDisp;
pDisp=m_webBrowser.get_Document(); //得到webBrowser控件接口 IHTMLDocument2* pDoc;
hr=pDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc); //得到网页文档接口 IHTMLElementCollection* pColl=NULL;
hr=pDoc->get_all(&pColl);//得到所有网页元素记录集合 IDispatch *pDisp2;
VARIANT index;//用于接收返回元素基于的索引,一般不用,设为就好,而是用IDispatch 接收元素对象接口
//V_VT(&index)=VT_I4;
//V_I4(&index)=0;
index.vt=VT_I4;
index.lVal=; VARIANT varID;//要查找的HTML标记ID
varID=StringToVariant(_T("userlike_info_head_img")); hr=pColl->item(varID,index,&pDisp2); //找到元素的位置
if(S_OK==hr&&NULL!=pDisp2)
{
IHTMLElement3* pElem=NULL;
hr=pDisp2->QueryInterface(IID_IHTMLElement3,(void**)&pElem);
IHTMLElementRender *pRender = NULL;
pElem ->QueryInterface(IID_IHTMLElementRender, (void **) &pRender);
pRender->DrawToDC(hImageDC);
}
}
/*=================================================================================*/ /*=================================================================================
判断网页是否加在完全(包含框架)
原理:如果直接早DocummentComple里判断的话,包含多个框架(frame)的网页就会多次激发该函数。所以这里我们这里通过pDish判断是不是主框架的的借口(最后调用该函数),如果是的话就是最后一次激发,表示主框架家在完毕,也就是整个网页加载完毕!
=====================================================================================*/
void CTieBaGuajiDlg::DocumentCompleteExplorer1(LPDISPATCH pDisp, VARIANT* URL)
{
// TODO: 在此处添加消息处理程序代码
CComQIPtr <IWebBrowser2, &IID_IWebBrowser2> pWeb;
CComQIPtr <IHTMLDocument2,&IID_IHTMLDocument2> pDoc2;
pWeb = pDisp;
pWeb-> get_Document((IDispatch**)&pDoc2);
if (m_webBrowser.get_Document() == pDoc2)
{
((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));
}
/////////////////////////////////////////
/*if(0==m_count)
{
((CListBox*)GetDlgItem(IDC_LIST_STATE))->AddString(_T("初始化完成!"));
m_count++;
}*/
}
/*=============================================================================*/
/*==============================================================================
另外如果不想让webbrowser空间弹出错误提示可以,在对空间资源编辑时设置Slient为TRUE
==============================================================================*/

http://blog.csdn.net/u012108436/article/details/50719446

『转』VC++ webbrowser函数使用范例的更多相关文章

  1. 『Python』为什么调用函数会令引用计数+2

    一.问题描述 Python中的垃圾回收是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. sys.g ...

  2. 『Python』matplotlib常用函数

    1. 绘制图表组成元素的主要函数 1.1 plot()--展现量的变化趋势 import numpy as np import matplotlib.pyplot as plt import matp ...

  3. 『实践』Yalmip获取对偶函数乘子

    『实践』Yalmip获取对偶函数乘子 一.sdpsetting设置 Yalmip网站给出的说明 savesolveroutput默认为0,需要设置为1才会保存输出结果. 下面是我模型的约束个数: 二. ...

  4. 『片段』OracleHelper (支持 多条SQL语句)

    C# 调用 Oracle 是如此尴尬 >System.Data.OracleClient.dll —— .Net 自带的 已经 过时作废. >要链接 Oracle 服务器,必须在 本机安装 ...

  5. 『设计』Laura.Compute 设计思路

    前言: 前一篇文章 <『开源』也顺手写一个 科学计算器:重磅开源> ,继 Laura.Compute 算法开源之后,有 博客园 园友 希望公开一下 Laura.Compute算法 的 设计 ...

  6. 转:『代码』JS封装 Ajax级联下拉列表

    在博客园看到一篇不错的AJAX级联下拉列表,觉得不错,特地拿下来 :转载来自:『大雪无痕』 ,原文地址 //当一个 下拉列表 改变时,触发所有联动:(警告:各下拉列表之间 请不要出现 循环依赖) // ...

  7. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  8. 『Numpy』内存分析_高级切片和内存数据解析

    在计算机中,没有任何数据类型是固定的,完全取决于如何看待这片数据的内存区域. 在numpy.ndarray.view中,提供对内存区域不同的切割方式,来完成数据类型的转换,而无须要对数据进行额外的co ...

  9. 『TensorFlow』滑动平均

    滑动平均会为目标变量维护一个影子变量,影子变量不影响原变量的更新维护,但是在测试或者实际预测过程中(非训练时),使用影子变量代替原变量. 1.滑动平均求解对象初始化 ema = tf.train.Ex ...

随机推荐

  1. Webpack实现路由懒加载的三种方式

    原文指路:https://blog.csdn.net/qq_37540004/article/details/78727063 第一种: 引入方式(正常引入): const router = new ...

  2. pytorch初步学习(一):数据读取

    最近从tensorflow转向pytorch,感受到了动态调试的方便,也感受到了一些地方的不同. 所有实验都是基于uint16类型的单通道灰度图片. 一开始尝试用opencv中的cv.imread读取 ...

  3. vivado实现模16的计数器

    `timescale 1ns / 1ps module ctr_mod_16( clk, rst_n, count ); input clk, rst_n; :] count; wire clk, r ...

  4. linux配置hadoop集群

    ①安装虚拟机 ②为虚拟机添加共享文件 右击已经安装好的虚拟机 设置—>选项—>共享文件 ③配置映射 sudo nano /etc/network/interfaces   重启网络:sud ...

  5. springboot activiti 配置项详解

    asyncExecutorEnabled属性设置设置true后将代替那些老的Job executorspring.activiti.async-executor-enabled=false sprin ...

  6. [CodeForces - 614E] E - Necklace

    E - Necklace Ivan wants to make a necklace as a present to his beloved girl. A necklace is a cyclic ...

  7. Android AES加密报错处理:javax.crypto.IllegalBlockSizeException: error:1e00007b:Cipher functions:OPENSSL_internal:WRONG_FINAL_BLOCK_LENGTH

    一.问题说明 今天写AES加/解密功能的apk,设想是四个控件(测试用的,界面丑这种东西请忽略) 一个编缉框----用于输入要加密的字符串 一个文本框----用于输出加密后的字符串,和加密后点击解密按 ...

  8. Linux只下载不安装软件包

    有时我们并不需要安装软件而只要下载软件包. 包格式 命令 命令所属包 命令下载格式 rpm yumdownloader yum-utils yumdownloader package_name deb ...

  9. 牛客网 PAT 算法历年真题 1010 : 月饼 (25)

    月饼 (25) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 月饼是中国人在中秋佳节时吃的一种传统食品,不同地 ...

  10. Java文档注释导出帮助文档和项目的jar包导入和导出。

    1.1      文档注释导出帮助文档 在eclipse使用时,可以配合文档注释,导出对类的说明文档,从而供其他人阅读学习与使用. 通过使用文档注释,将类或者方法进行注释用@简单标注基本信息.如@au ...