vc浏览器 uc浏览器网页版入口
- 游戏测评
- 2024-11-10 09:50
- 1
VC下使用COM实现和IE浏览器交互的几种方法
IE实例遍历实现
vc浏览器 uc浏览器网页版入口
vc浏览器 uc浏览器网页版入口
vc浏览器 uc浏览器网页版入口
vc浏览器 uc浏览器网页版入口
vc浏览器 uc浏览器网页版入口
---- 首先我们来看系统是如何知道当前有多少个IE的实例在运行。
----
我们知道在Windows体系结构下,一个应用程序可以通过作系统的运行对象表来和这些应用的实例进行交互。但是IE当前的实现机制是不在运行对象表中进行注册,所以需要采用其他的方法。我们知道可以通过ShellWindows来代表属于shell的当前打开的窗口的,而IE就是属于shell的一个应用程序。
---- 下面我们描述一下用VC实现对当前
IE实例的进行遍历的方法。IShellWindows是关于系统shell的一个接口,我们可以定义一个如下的接口变量:
SHDocVw::IShellWindowsPtr m_spSHWinds;
然后创建变量的实例:
m_spSHWinds.CreateInstance
(__uuidof(SHDocVw::ShellWindows));
通过IShellWindows接口的方法GetCount
可以得到当前实例的数目:
long
nCount = m_spSHWinds- >GetCount();
通过IShellWindows接口的方法Item
可以得到每一个实例对象
IDispatchPtr
spDisp;
_variant_t
va(i, VT_I4);
spDisp
= m_spSHWinds->Item(va);
然后我们可以判断实例对象是不是
属于IE浏览器对象,通过下面的语句实现:
SHDocVw::IWebBrowser2Ptr
spBrowser(spDisp);
assert(spBrowser
!= NULL)
----在得到了IE浏览器对象以后,我们可以调用IWebBrowser2Ptr接口的方法来得到当前的文档对象的指针:
MSHTML::IHTMLDocument2Ptr spDoc(spBrowser->GetDocument());
----
然后我们就可以通过这个接口对这个文档对象进行作,比如通过Gettitle得到文档的标题。
----
我们在浏览网络的时候,一般总会同时开很多IE的实例,如果这些页面都是很好的话,我们可能想保存在硬盘上,这样,我们需要对每一个实例进行保存,而如果我们采用上面的原理,我们可以得到每一个IE的实例及其网页对象的接口,这样就可以通过一个简单的程序来批量的保存当前的所有打开的网页。采用上面介绍的方法实现了对当前IE实例的遍历,但是我们希望得到每一个IE实例所产生的,这就需要通过DLL的机制来实现。
---- 3.和IE相绑定的DLL的实现
----
我们介绍一下如何建立和IE进行绑定的DLL的实现的过程。为了和IE的运行实例进行绑定,我们需要建立一个能够和每一个IE实例进行绑定的DLL。IE的启动过程是这样的,当每一个IE的实例启动的时候,它都会在注册表中去寻找这个的一个CLSID,具体的注册表的键位置为:
HKEY_LOCALL_MACHINESOFTWAREMicrosoftWindows
CurrentVersionExplorerBrowser Helper Objects
----
当在这个键位置下存在CLSIDs的时候,IE会通过使用CoCreateInstance()方法来创建列在该键位置下的每一个对象的实例。注意对象的CLSIDs必须用子键而非名字值的形式表现,比如{DD41D66E-CE4F-11D2-8DA9-00A0249EABF4}
就是一个有效的子键。我们使用DLL的形式而非EXE的形式的原因是因为DLL和IE实例运行在同一个进程空间里面。每一个这种形式的DLL必须实现接口IObjectWithSite,其中方法SetSite必须被实现。通过这个方法,我们自己的DLL就可以得到一个指向IE
COM对象的IUnknown的指针,实际上通过这个指针我们就可以通过COM对象中的方法QueryIntece来遍历所有可以得到的接口,这是COM的基本的机制。当然我们需要的只是IWebBrowser2这个接口。
----
实际上我们建立的是一个COM对象,DLL只不过是COM对象的一种表现形式。我们建立的COM对象需要建立和实现的方法有:
----1.
IOleObjectWithSite接口的方法SetSite必须实现。实际上IE实例通过这个方法向我们的COM对象传递一个接口的指针。设我们有一个接口指针的变量,不妨设为:
----CComQIPtr< IWebBrowser2, &IID_IWebBrowser2 >
m_myWebBrowser2;
----
我们就可以在方法SetSite中把这个传进来的接口指针赋给m_myWebBrowser2。
2. 在我们得到了指向IE
COM对象的接口后,我们需要把自己的DLL和IE实例所发生的相关连,为了实现这个目的,需要介绍两个接口:
----(1)
IConnectionPointContainer。这里使用这个接口的目的是用来根据它得到的IID来建立和DLL的一个特定的连接。比如我们可以进行如下的定义:
CComQIPtr< IConnectionPointContainer,
&IID_IConnectionPointContainer
>spCPContainer(m_myWebBrowser2);
----然后,我们需要把所有IE中发生的和我们的DLL进行通讯,可以使用
IConnectPoint。
----(2)
IConnectPoint。通过这个接口,客户可以对连接的对象开始或者是终止一个aisory循环。IConnectPoint有两个主要的方法,一个为A,另一个为Unaise。对于我们的应用来说,Aise是用来在每一个IE发生的和DLL之间建立一个通道。而Unaise就是用来终止以前用Aise建立的通知关系。比如我们可以定义IConnectPoint接口如下:
CComPtr< IConnectionPoint > spConnectionPoint;
----
然后,我们要使所有在IE实例中发生的和我们的DLL相关,可以使用如下的方法:
hr = spCPContainer->FindConnectionPoint(
DIID_DWebBrowserEvents2, &spConnectionPoint);
----然后我们通过IConnectPoint接口的方法A使每当IE有一个新的发生的时候,都能够让我们的DLL知道。可以用如下的语句实现:
hr = spConnectionPoint- >Aise(
(IDispatch)this, &m_dwIDCode);
----在把IE实例中的和我们的DLL之间建立联系以后,我们可以通过IDispatch接口的Invoke()方法来处理所有的IE的。
----3.
IDispatch接口的Invoke()方法。IDispatch是从IUnknown中继承的一个接口的类型,通过COM接口提供的任何服务都可以通过IDispatch接口来实现。IDispatch::Invoke的工作方式同vtbl幕后的工作方式是类似的,Invoke将实现一组按索引来访问的函数,我们可以对Invoke方法进行动态的定制以提供不同的服务。Invoke方法的表示如下:
STDMETHOD(Invoke)(DISPID dispidMember,REFIID
riid, LCID lcid, WORD wFlags,
DISPPARAMS pdispparams, VARIANT pvarResult,
EXCEPINFO pexcep, UINT puArgErr);
----其中,DISPID是一个长整数,它标识的是一个函数。对于IDispatch的某一个特定的实现,DISPID都是的。IDispatch的每一个实现都有其自己的IID,这里dispidMemeber实际上是可以认为是和IE实例所发生的每一个相关的方法,比如:DISPID_BEFORENAVIGATE2,DISPID_NAVIGATECOMPLETE2等等。这个方法中另外一个比较重要的参数是DISPPARAMS,它的结构如下:
typedef struct tagDISPPARAMS
{VARIANTARG
rgvarg;
//VARIANTARG是同VARAIANT相同的,可以在
//OAIDL.IDL中找到。所以实际上rgvarg是一个参数数
//组
DISPID rgdispidNameArgs; //命名参数的DISPID
unsigned
int
cArgs; //表示数组中元素的个数
unsigned
int
CnameArgs; //命名元素的个数
}DISPPARAMS
----要注意的是每一个参数的类型都是VARIANTARG,所以在IE和我们DLL之间可以传递的参数类型的数目是有限的。只有那些能够被放到VARIANTARG结构中的类型才可以通过调度接口进行传递。比如对于DISPID_NAVIGATECOMPLETE2来说:个参数表示IE在访问的URL的值,类型是VT_BYREF|VT_VARIANT。注意DISPID_NAVIGATECOMPLETE2等DISPID已经在VC中被定义,我们可以直接进行使用。如上说述,我们在方法Invoke中可以得到所有IE实例所发生的,我们可以把这些数据放到文件中进行事后的分析,也可以放到一个列表框中实时的显示。
---- 4.微软的HTML文档对象模型和应用分析
----
下面我们来看如何得到网页文档的接口:网页文档的接口为IHTMLDocument2,可以通过调用IE
COM对象的get_Document方法来得到网页的接口。使用如下的语句:
hr = m_spWebBrowser2- >get_Document(&spDisp);
CComQIPtr< IHTMLDocument2,
&IID_IHTMLDocument2 > spHTML;
spHTML = spDisp;
----
这样我们就得到了网页对象的接口,然后我们就可以对网页进行分析,比如通过IHTMLDocument2提供的方法get_URL我们可以得到和该网页相关的URL的地址值,通过get_forms方法可以该网页中所有的Form对象的。实际上W3C组织已经制定了一个DOM(Document
Objec
Model)标准,当然这个标准不仅仅是针对HTML,同时还是针对XML制定的。W3C组织只是定义了网页对象的接口,不同的公司可以采用不同的语言和方法进行具体的实现。按照W3C组织定义的网页对象被认为是动态的,即用户可以动态的对网页对象里面所包含的每一个对象进行作。这里的对象可以是指一个输入框,也可以是图象和声音等对象。同时按照W3C的正式文档的说明,网页对象是可以动态增加和删除的。事实上,很少有厂商实现了DOM定义的所有功能。微软对网页对象的定义也基本上是按照这个标准实现的。但是当前的接口还不支持动态的增加和删除元素,但是可以对网页中的基本元素进行属性的修改。比如IHTMLElementCollection表示网页中一些基本的元素的,IHTMLElement表示网页中的一个基本的元素。而象IHTMLOptionElement接口就表示一个特定的元素Option。基本的元素都有setAttribute和geAttribute方法来动态的设置和得到元素的名称和值。
----
较为常见的一个应用是我们能够分析网页中是否有需要填写的Forms,如果这个网址的Forms以前已经填写过而且数据我们已经保存下来的话,我们就可以把数据自动放到和该URL下的Forms的相关的位置中去。另外,我们可以总结网页上需要填写的Form的数据项,先对这些数据项进行赋值,以后碰到有相同的数据项的时候就自动把我们赋值的内容填写进去。实际上Form是对象,Form中包含的元素,比如INPUT,OPTION,SELECT等类型的输入元素都是对象。
----
另外一个可以想到的应用是自动对网页中的文本进行翻译,因为我们可以修改网页中任何对象的属性,所以我们可以把里面不属于本国语言的部分自动翻译成本国语言,当然真正的实现还要靠自然语言理解方面技术的突破,但是IE浏览器的接口和对象的形式使我们能够灵活的控制整个IE,无论是从对象还是到网页对象。
如何在VC程序中获取IE浏览器的设置
分类: 电脑/网络 >> 软件 >> 其他软件
问题描述:
估计与IE的配置文件或者注册表某些特定键值有关,谢~
解析:
在具体使用的时候需要增加头文件#include
程序代码
------------------------------------------------------------------
@ProxyType 类型,如HTTP,SOCKS,FTP...
@ProxyAddr 返回的地址
@ProxyPort 返回的端口
返回值
0: 无错误
-1: 查询IE的失败
-2: 无此类型的
-3: 其他错误
-4: 无设置信息
int GetIEProxy(CString ProxyType,CString &ProxyAddr,int &ProxyPort)
{unsigned long nSize = 4096;
char szBuf[4096] = { 0 };
Read IE settings
INTERNET_PROXY_INFO pInfo = (INTERNET_PROXY_INFO)szBuf;
if(!InterQueryOption(NULL, INTERNET_OPTION_PROXY, pInfo, &nSize))
{return -1; 查询IE的失败!
}CString strTmp (pInfo->lpszProxy);
if (strTmp.IsEmpty()) return -4;无设置信息
int nStart=0,nPos,nCurLen;
CString strProxyType = ProxyType;
strProxyType += "=";
此时的结构如下
socks=192.168.1.100:3080 =192.168.1.100:808 =192.168.1.100:808 gopher=192.168.1.100:808 ftp=192.168.1.100:808
strTmp.MakeUpper();转化为大写
strProxyType.MakeUpper();
nCurLen = strTmp.GetLength();
nPos = strTmp.Find(strProxyType.GetBuffer(0),nStart);
if (nPos>=0)
{strTmp = strTmp.Right(nCurLen - nPos);
strTmp.TrimLeft();
nCurLen = strTmp.GetLength();
到此结构如下
HTTP=192.168.1.100:808 gopher=192.168.1.100:808 ftp=192.168.1.100:808
获取单独的协议部分
nPos = strTmp.Find(" ",nStart);
if (nPos>=0)
{strTmp = strTmp.Left(nPos);
strTmp.TrimRight();
nCurLen = strTmp.GetLength();
到此结构如下
HTTP=192.168.1.100:808
取掉协议名称部分
strTmp = strTmp.Right(nCurLen-strProxyType.GetLength());
nCurLen = strTmp.GetLength();
到此结构如下
192.168.1.100:808
nPos = strTmp.Find(":",nStart);
if (nPos>0)必须要大于0
{ProxyAddr = strTmp.Left(nPos);
strTmp = strTmp.Right(nCurLen-nPos-1);
strTmp.TrimLeft();
strTmp.TrimRight();
ProxyPort = atoi(strTmp);
return 0;
}else
{return -3;
}}
else
{return -3;
}}
else
{return -2;无此类型的
}}
你这个是旧的方法(IE4 and earlier)了,从IE5开始,使用
INTERNET_OPTION_PER_CONNECTION_OPTION来Invoke InterQueryOption,详细内容可以参考MS Q226473
如何编程动态改变IE的设置, 并且使之马上生效!
用到的关键函数是wini库里面的InterSetOption. msdn里面有对它详细的介绍, 可以自己去看看. 当把参数dwOption设置为INTERNET_OPTION_SETTINGS_CHANGED的时候. 他就会促使IE在下一次打开网页的时候重新到注册表里面去取的设置信息. 所以我们就可以先将注册表里面的信息更改掉, 然后调用InterSetOption函数, 从而达到使自己想要的设置马上生效的目的.
下面的函数可以实现改变IE的设置的目的. 里面加了少许的注释以帮助大家理解.
BOOL SetHttpProxy(CString ip, UINT port)
{CString l_just;
l_just.Format("=%s:%d", ip.LockBuffer(), port);
下面的代码将注册表项HKEY_CURRENT_USERSofareMicrosoftWindowsCurrentVersionInter SettingsProxy
的内容取出来
HKEY hKeyIn = HKEY_CURRENT_USER, hKeyOut;
if( ERROR_SUCCESS != RegOpenKeyEx(hKeyIn, "SofareMicrosoftWindowsCurrentVersionInter Settings", 0, KEY_CREATE_LINK | KEY_WRITE | KEY_READ | KEY_NOTIFY, &hKeyOut))
{return FALSE;
}ULONG regsize = 0;
if(ERROR_SUCCESS != RegQueryValueEx(hKeyOut, "Proxy", NULL, NULL, NULL, ®size))
{return FALSE;
}LPBYTE pValue = new BYTE[regsize];
memset(pValue, 0x00, regsize);
if(ERROR_SUCCESS != RegQueryValueEx(hKeyOut, "Proxy", NULL, NULL, pValue, ®size))
{return FALSE;
}CString oldproxy((char )pValue);
delete [] pValue;
pValue = NULL;
从注册表中读出来的数据格式为:=111.111.111.111:80;ftp=222.222.222.222:21;......,
如果你只想改变的的话, 就只要把其中的111.111.111.111:80换成你想要的就行了,
类似的你可以改变其他的.
下面的代码就替换成为参数所指定的.
int = 0;
如果没有字符串中没有找到"="说明用户没有设置,这时候直接加在最前面.
if(-1 == ( = oldproxy.Find("=")))
{ = 0;
}int 1 = 0;
if(-1 == (1 = oldproxy.Find(";", )))
{1 = oldproxy.GetLength();
}oldproxy.Delete(, 1 - );
oldproxy.Insert(, l_just);
if(ERROR_SUCCESS != RegSetValueEx(hKeyOut, "Proxy", 0, REG_SZ, (const unsigned char )oldproxy.LockBuffer(), oldproxy.GetLength() + 1))
{return FALSE;
}RegCloseKey(hKeyOut);
使设置生效
if(!InterSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0))
{return FALSE;
}return TRUE;
}在使用此函数的时候不要忘记包含头文件 #include
vc浏览器没登录后台打开怎样办
VC浏览器在哪里将浏览器标识UA改成PC版,下面为大家介绍将浏览器标识UA改成PC版方法?
...展开
品牌型号:
VivoY55
系统版本:
Android6.0.1
软件版本:
VC浏览器1.6.7.1001
方法/步骤分步阅读
1/6
打开VC浏览器。
2/6
点击页面底部“三”图标按钮。
3/6
在弹出的窗口中,选择“设置”按钮。
4/6
在“设置”窗口中,找到“浏览器标识(UA)”栏目。
5/6
在窗口中,勾选“PC”栏目。
6/6
以上就是VC浏览器将浏览器标识UA改成PC版的方法。
步
打开系统【设置】显示页面,下滑点击【通用】。
第二步
【通用】页面显示,下滑点击【后台app刷新】。
第三步
下滑页面找到【UC浏览器】旁边开关标签,点击打开。
vc浏览器为什么是4g网不管看了
浏览器的系统默认的设置问题,是为了保护用户的流量的。
这个你可以在浏览器的设置那里可以调成流量播放。
全球使用量的第三方手机浏览器,UC浏览器为全球移动互联网用户提供聪明智能的手机上网服务。
目前已覆盖UC浏览器Android、iOS、Windows等主流移动作系统。
200多个品牌、超过3000款手机及平板电脑终端均可使用,并于2014年推出了PC版。
vc浏览器能够去掉吗
那你是想继续禁用还不是不禁用?
解禁方法:
点击浏览器右上角菜单栏;
打开菜单栏中的“工具”,选择“Internet选项”;
再选择“安全”标签,单击“自定义级别”,将安全设置为“默认级别”;
在这里设置“禁止自动脚本更新”,并且取消“禁止运行Active控件”的选中状态,关闭窗口即可。
版权声明:本文内容由互联网用户自发贡献。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 836084111@qq.com,本站将立刻删除。
下一篇