升级版说明:增加对获取指定控件的判断,利用标志bGetCaller,减少循环和递归,基于效能提升门户生产地址获取主叫,可从60s压缩到6s
1.独立代码
#include <atlbase.h>
#include <mshtml.h>
#include <winuser.h>
#include <comdef.h>
#include <string.h>
void EnumIE(void);//处理网页
void EnumFrame(IHTMLDocument2 * pIHTMLDocument2);//处理框架
CComModule _Module;//使用CComDispatchDriver ATL的智能指针,此处必须声明
#include <atlcom.h>
void EnumAllElement(IHTMLDocument2 * pIHTMLDocument2);//获取网页内元素
CString glb_strCaller;//全局主叫
BOOL glb_bGetCaller;//是否获取到主叫
void EnumIE(void)
{
CComPtr<IShellWindows> spShellWin;
HRESULT hr=spShellWin.CoCreateInstance(CLSID_ShellWindows);
if (FAILED(hr))
{
return;
}
long nCount=0; //取得浏览器实例个数(Explorer和IExplorer)
spShellWin->get_Count(&nCount);
if (0==nCount)
{
return;
}
for(int i=0; i<nCount; i++)
{
CComPtr<IDispatch> spDispIE;
hr=spShellWin->Item(CComVariant((long)i), &spDispIE);
if (FAILED(hr)) continue;
CComQIPtr<IWebBrowser2>spBrowser=spDispIE;
if (!spBrowser) continue;
CComPtr<IDispatch> spDispDoc;
hr=spBrowser->get_Document(&spDispDoc);
if (FAILED(hr)) continue;
CComQIPtr<IHTMLDocument2>spDocument2 =spDispDoc;
if (!spDocument2) continue;
//Modify by Fang jiansheng 2011-04-02
//*******************************************************************************
CString cIEUrl_Filter; //设置的URL(必须是此URL的网站才有效);
cIEUrl_Filter="http://172.20.33.130:8082/csp/"; //效能提升门户过滤的网址
//*******************************************************************************
CComBSTR IEUrl;
spBrowser->get_LocationURL(&IEUrl);
CString cIEUrl_Get; //从机器上取得的HTTP的完整的URL;
cIEUrl_Get=IEUrl;
cIEUrl_Get=cIEUrl_Get.Left(cIEUrl_Filter.GetLength()); //截取前面N位
if (strcmp(cIEUrl_Get,cIEUrl_Filter)==0)
{
// 程序运行到此,已经找到了IHTMLDocument2的接口指针
glb_bGetCaller=false;//恢复主叫未获取标志
EnumAllElement(spDocument2);//枚举所有字段
}
}
}
//在框架内获取主叫
void EnumAllElement(IHTMLDocument2 * pIHTMLDocument2) //枚举所有字段
{
if (!pIHTMLDocument2) return;
EnumFrame(pIHTMLDocument2); //递归枚举当前IHTMLDocument2上的子框架frame
if (glb_bGetCaller) return;//已获取主叫
HRESULT hr;
CComQIPtr<IHTMLElementCollection> spAllElement;
hr=pIHTMLDocument2->get_all(&spAllElement);//获取所有网页内所有元素
if (FAILED(hr))return;
long nLength = 0;
spAllElement->get_length (&nLength);
for (int i = 0; i < nLength; i++)
{
CComPtr<IDispatch> pDisp;
hr = spAllElement->item(COleVariant((long)i),COleVariant((long)0),&pDisp); //获取单个元素
if(SUCCEEDED(hr))
{
//CComQIPtr <IHTMLElement, &IID_IHTMLElement> pElement(pDisp);
CComQIPtr<IHTMLElement, &IID_IHTMLElement> pElement;
pDisp->QueryInterface(&pElement);
BSTR bTemp;
pElement->get_id(&bTemp);//可以获取其他特征,根据具体元素而定
CString strTemp=bTemp;
if(!strTemp.IsEmpty() && strTemp=="callNo")//根据id是主叫号码获取值或作其他处理
{
IHTMLInputTextElement* input;
pDisp->QueryInterface(IID_IHTMLInputTextElement,(void**)&input);
input->get_value(&bTemp);
if(bTemp==NULL) glb_strCaller="";
else glb_strCaller=bTemp;
glb_bGetCaller=true;//找到主叫
break;
}
}
}
}
//循环页面框架
void EnumFrame(IHTMLDocument2 * pIHTMLDocument2)
{
if (!pIHTMLDocument2) return;
if (glb_bGetCaller) return;//已获取主叫
HRESULT hr;
CComPtr<IHTMLFramesCollection2> spFramesCollection2;
pIHTMLDocument2->get_frames(&spFramesCollection2); //取得框架frame的集合
long nFrameCount=0; //取得子框架个数
hr=spFramesCollection2->get_length(&nFrameCount);
if (FAILED(hr)|| 0==nFrameCount) return;
for(long i=0; i<nFrameCount; i++)
{
CComVariant vDispWin2; //取得子框架的自动化接口
hr = spFramesCollection2->item(&CComVariant(i), &vDispWin2);
if (FAILED(hr)) continue;
CComQIPtr<IHTMLWindow2>spWin2 = vDispWin2.pdispVal;
if (!spWin2) continue; //取得子框架的 IHTMLWindow2 接口
CComPtr <IHTMLDocument2> spDoc2;
spWin2->get_document(&spDoc2); //取得子框架的 IHTMLDocument2 接口
EnumAllElement(spDoc2); //递归枚举当前子框架 IHTMLDocument2 上的所有控件
}
}
//-----------结束---------------------//
2.执行代码:
void CDemoDlg::OnOK()
{
// TODO: Add extra validation here
::CoInitialize(NULL); //初始化COM
EnumIE(); //枚举浏览器
::CoUninitialize(); //释放COM
//CDialog::OnOK();
}
分享到:
相关推荐
标题中的"DAQandVC.zip_DAQ VC_NI-DAQ_NI采集卡 C#_VC调用NI采集卡_daq采集卡FRM11"表明这是一个关于使用Visual C++(VC)编程来调用National Instruments(NI)的DAQ(数据采集)设备,具体是NI-DAQ硬件,且该应用...
【VC操作网页元素源码详解】 在信息技术领域,VC(Visual C++)是一种广泛使用的Microsoft开发工具,用于创建Windows应用程序。在本项目中,“vc操作网页元素源码”利用了VC与Internet Explorer(IE)浏览器的接口...
VC下的OpenGL开发框架与应用举例 VC下的OpenGL开发框架与应用举例 VC下的OpenGL开发框架与应用举例
策略为王源代码无删减版本------vc++6.0-------可以升级到vc2024-----64位---- 策略为王源代码无删减版本------vc++6.0-------可以升级到vc2024-----64位---- 策略为王源代码无删减版本------vc++6.0-------可以升级...
在IT行业中,尤其是在Windows平台下的开发,VC++(Visual C++)是一种广泛使用的编程环境,它结合了C++编译器和MFC(Microsoft Foundation Classes)库,为开发者提供了构建桌面应用程序的强大工具。本篇文章将深入...
DOM开发,用VC6获取网页WEBBROWSER2,IHTMLDOCUMENT元素
在VC(Visual C++)环境下实现声音信号的实时采集是一个涉及多媒体编程的重要任务,它涵盖了音频硬件接口、数据处理和用户界面等多个方面的技术。本文将深入探讨如何在VC下进行声音信号的实时采集,以及相关的知识点...
VC 限定框架窗口的大小和位置,无法移动且固定大小的SDI,用VC 编写实现这种固定窗口大小,且无法用鼠标拖动的窗口。窗口是不能改变大小的,窗口标题也不能被拖动,运行程序后,窗口的位置就已经固定,并不能移动和...
VC框架窗口界面设计教程 vc教程 vc界面设计VC框架窗口界面设计教程 vc教程 vc界面设计VC框架窗口界面设计教程 vc教程 vc界面设计
本篇将深入探讨"框架窗口vc开发"这一主题,包括框架窗口的概念、如何在VC中创建框架窗口以及相关的控件使用。 框架窗口(Frame Window)是MFC(Microsoft Foundation Classes)库中的一个关键概念,它是大部分用户...
给出了关于VC/MFC文档-视图-框架体系的编程实例,详细介绍了VC/MFC文档编程,视图编程,窗口静态切分和动态切分,多文档和单文档程序设计,包含了(30个实例),资源的实例均从光盘中拷出来的,能够正常运行
标题 "vc实现网页截图(不用打开网页)" 描述了一个使用VC6++编程语言来创建一个应用程序,该程序能够截取指定网站的整个页面,并将其保存为JPEG图像。虽然这个功能在大多数情况下都能正常工作,但是对于包含框架的...
上微机vc6.0下位机单片机控制ds18b20源代码,对 温度实时采集,发送给上微机并显示在vc上。
VC 超多窗口框架视图例子源码集锦,这些例子对于学习VC 的文档视图会有很好的帮助作用,相信会初学者很有用,列举一些例子名称: 保存或恢复框架窗口的状态 创建新的框架窗口 如何禁止框架窗口在标题中...
这个压缩包“opencv-4.5.5-vc14_vc15最新版本”包含了OpenCV库的4.5.5版,适用于Visual Studio 2017(vc14)和Visual Studio 2019(vc15)编译环境。OpenCV库不仅支持C++,还提供了Python、Java等其他编程语言的接口...
"VC6.rar_ok采集卡_视频采集_VC_视频采集卡"这个标题暗示了这是一个与使用Visual C++ 6(简称VC6)进行视频采集卡编程相关的资源包。在接下来的内容中,我们将深入探讨如何使用VC6来开发与OK采集卡配合的视频采集...
VC下的OpenGL框架程序,留了清晰地接口给用户。
【标题】"VC6.0 SNMP 协议获取table值"是关于在Microsoft Visual C++ 6.0环境下,利用SNMP(简单网络管理协议)从远程设备获取表(table)数据的应用示例。SNMP是一种广泛用于网络设备管理的标准协议,它允许管理员...