最近开发WINDOWS下的应用程序,需要用到C++中调用WEBBROWSER控件操作网页的相关技术,查阅了一下相关文档,反复调试了几天,对其中的技术有了一些肤浅的认识,大多数C++程序员对COM应该不陌生,其实用C++操作网页,在前端应用层上主要就是对COM接口的查询与使用。以下是我写的一些代码与大家分享一下,总结一下几个关键点,
1、首先要找准元素的接口类型,html的标签(即元素类型,也许我的说法过于肤浅),有关元素类型的定义在mshtml.h头文件基本包括了所有接口类型,要是对web元素接口类型不太了解,可在网上查一下,有很多对定义有中文注释的资料;
2、要对com接口的查询(QueryInterface())格外注意,使用智能指针时的初始化声明,其实也是通过接口查询对指针进行的初始化赋值,接口的查询成败与否,直接关系到能否对网页元素进操作,所以至关重要;
下面是一些代码和简单的注释,希望对需要的朋友们能有所帮助,
//根据类名查找网页元素
CComQIPtr<IHTMLElement> FindWebElement(CComQIPtr<IHTMLElementCollection> pEleColl,string strClassName)
{
CComQIPtr<IHTMLElement> spRetEle;
if(pEleColl == NULL)
{
//所给集合为空时,使用网页控件接口获取顶层页面的全部元素集合(这个是我程序类成员m_pWebBrowserEventHandler->m_pWebClientCall)
CComPtr<IWebBrowser2> pWeb2 = m_pWebBrowserEventHandler->m_pWebClientCall->GetWebBrowser2();
CComPtr<IDispatch> spDp = NULL;
if(pWeb2)
{
HRESULT hr;
hr=pWeb2->get_Document(&spDp);
if(FAILED(hr))
return spRetEle;
}
else
return spRetEle;
CComQIPtr<IHTMLDocument2> pHtmlDoc2 = spDp;
pHtmlDoc2->get_all(&pEleColl);
}
long lCollCount = 0;
pEleColl->get_length(&lCollCount);