用WebBrowser空间得到IHTMLDocument借口可以完成解析,但我不希望WebBrowser渲染网页,仅仅希望解析出DOM树就可以了。
有什么接口函数可以做到?
有什么接口函数可以做到?
解决方案 »
- 求助 access里创建表?
- 想做个吸管工具,但是颜色选不准
- 字符编码转换的问题
- winxp下vc如何判断电脑的usb接口是否2.0!
- [高分求助 急 ]如何将Yacc控制台程序改为MFC界面?
- 小弟在编译一个DirectShow程序,出现这个错误,wsprintfWInternal”: 即使使用参数相关的查找,也未找到标识符
- Delphi调用VC写DLL问题,急!
- 继承了CPropertySheet,添加ON_MESSAGE(PSM_CHANGED在Release下出错
- 牛人进来看!
- 请问什么地方有VC7.0的资料或源码?
- 请教关于串口部分读取的问题,多谢
- 使SHFileOperation的进度对话框变成模式的?
IHTMLDOMNode2
IHTMLDOMAttribute
IHTMLDOMAttribute2msdn 例子:
IHTMLDOMNode* pElemDN;
IDispatch* pACDisp;
IHTMLAttributeCollection* pAttrColl;
IDispatch* pItemDisp;
IHTMLDOMAttribute* pItem;LONG lACLength;
VARIANT vACIndex;
BSTR bstrName;
VARIANT vValue;
VARIANT_BOOL vbSpecified;m_pElem->QueryInterface(IID_IHTMLDOMNode, (void**)&pElemDN);
pElemDN->get_attributes(&pACDisp);
pACDisp->QueryInterface(IID_IHTMLAttributeCollection, (void**)&pAttrColl);
pAttrColl->get_length(&lACLength);vACIndex.vt = VT_I4;
for (int i = 0; i < lACLength; i++)
{
vACIndex.lVal = i;
pAttrColl->item(&vACIndex, &pItemDisp);
pItemDisp->QueryInterface(IID_IHTMLDOMAttribute, (void**)&pItem);
pItem->get_specified(&vbSpecified);
pItem->get_nodeName(&bstrName);
pItem->get_nodeValue(&vValue);
pItemDisp->Release();
pItem->Release();
}pElemDN->Release();
pACDisp->Release();
pAttrColl->Release();
在只有html文件的情况下,怎样取得IHTMLDOMNode及相应的接口?
怎样能不通过WebBrwoser控件而获得IHTMLDocument接口?
取得文档的方法最简单,调用 CHtmlView::GetHtmlDocument() 函数。
<2> 如果你的程序中使用了“Web 浏览器” 的ActiveX 控件。
取得文档的方法也比较简单,调用 CWebBrowser2::GetDocument() 函数。
<3> 如果你的程序是用 ATL 写的 ActiveX 控件。
那么需要调用 IOleClientSite::GetContainer 得到 IOleContainer 接口,然后就可以通过 QueryInterface() 查询得到 IHTMLDocument2 的接口。主要代码如下: CComPtr < IOleContainer > spContainer;
m_spClientSite->GetContainer( &spContainer );
CComQIPtr < IHTMLDocument2 > spDoc = spContainer;
if ( spDoc )
{
// 已经得到了 IHTMLDocument2 的接口指针
} <4> 如果你的程序是用 MFC 写的 ActiveX 控件。
那么需要调用 COleControl::GetClientSite() 得到 IOleContainer 接口,然后的操作和<3>是一致的了。
<5> IE 浏览器作为独立的进程正在运行。
每个运行的浏览器(IE 和 资源浏览器)都会在 ShellWindows 中进行登记,因此我们要通过 IShellWindows 取得实例(示例程序中使用的就是这个方法)。主要代码如下:#include < atlbase.h >
#include < mshtml.h >void FindFromShell()
{
CComPtr< IShellWindows > spShellWin;
HRESULT hr = spShellWin.CoCreateInstance( CLSID_ShellWindows );
if ( FAILED( hr ) ) return; long nCount=0;
spShellWin->get_Count(&nCount); // 取得浏览器实例个数 for(long i=0; i<nCount; i++)
{
CComPtr< IDispatch > spDisp;
hr=spShellWin->Item(CComVariant( i ), &spDisp );
if ( FAILED( hr ) ) continue; CComQIPtr< IWebBrowser2 > spBrowser = spDisp;
if ( !spBrowser ) continue; spDisp.Release();
hr = spBrowser->get_Document( &spDisp );
if ( FAILED ( hr ) ) continue; CComQIPtr< IHTMLDocument2 > spDoc = spDisp;
if ( !spDoc ) continue; // 程序运行到此,已经找到了 IHTMLDocument2 的接口指针
}
} <6> IE 浏览器控件被一个进程包装在一个子窗口中。那么你首先要得到那个进程的顶层窗口句柄(使用 FindWindow() 函数,或其它任何可行的方法),然后枚举所有子窗口,通过判断窗口类名是否是“Internet Explorer_Server”,从而得到浏览器的窗口句柄,再向窗口发消息取得文档的接口指针。主要代码如下:
#include < atlbase.h >
#include < mshtml.h >
#include < oleacc.h >
#pragma comment ( lib, "oleacc" )BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
TCHAR szClassName[100]; ::GetClassName( hwnd, &szClassName, sizeof(szClassName) );
if ( _tcscmp( szClassName, _T("Internet Explorer_Server") ) == 0 )
{
*(HWND*)lParam = hwnd;
return FALSE; // 找到第一个 IE 控件的子窗口就停止
}
else return TRUE; // 继续枚举子窗口
};void FindFromHwnd(HWND hWnd)
{
HWND hWndChild=NULL;
::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );
if(NULL == hWndChild) return; UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
LRESULT lRes;
::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*) &lRes ); CComPtr < IHTMLDocument2 > spDoc;
HRESULT hr = ::ObjectFromLresult ( lRes, IID_IHTMLDocument2, 0 , (LPVOID *) &spDoc );
if ( FAILED ( hr ) ) return; // 程序运行到此,已经找到了 IHTMLDocument2 的接口指针
}
我啥都没有,只有一个xxx.htm文件,怎样得到此HTML文件的IHTMLDocument接口?不通过WebBrowser等其它控件,直接得到IHTMLDocument接口,而无须渲染页面(节省不必要的开支)。
其实就是想通过IHTMLDocument接口操作页面执行一些动作。
1. IXMLDOMDocument(Document接口)
DOMDocument 对象是XML DOM的基础,你可以利用它所暴露的属性和方法来浏览、查询和修改XML文档的内容和结构。DOMDocument表示了树的顶层节点,它 实现了DOM文档的所有的基本方法,并且提供了额外的成员函数来支持XSL和XSLT。它创建了一个文档对象,所有其他的对象都可以从这个文档对象中得到 和创建。
2. IXMLDOMNode(Node接口)
IXMLDOMNode是文档对象模型(DOM)中的基本对象,元素、属性、注释、过程指令和其他的文档组件都可以认为是IXMLDOMNode。事实上,DOMDocument对象本身也是一个IXMLDOMNode对象。
3. IXMLDOMNodeList
IXMLDOMNodeList实际上是一个节点(Node)对象的集合,节点的增加、删除和变化都可以在集合中立刻反映出来,可以通过"for.循环 "结构来遍历所有的节点。
我想通过IHTMLDocument接口执行一些动作,比如通过IHTMLFormElement接口执行submit动作,就可以自动发痛表单了,这样的目的XML操作类能做到吗?不是为了读取和编辑HTML文件。