无法将类型为mshtml.HTMLButtonElementClass的COM对象强制转换为类类型mshtml.HTMLInputElementClass

html-css09

无法将类型为mshtml.HTMLButtonElementClass的COM对象强制转换为类类型mshtml.HTMLInputElementClass,第1张

在用.net2.0调用COM的某方法时报:

System.InvalidCastException: 无法将类型为“*Class”的 COM 对象强制转换为接口类型“I*”。此操作失败的原因是对 IID 为“{BBB9E30B-B4EB-4560-B5A7-1B59B33EF6BF}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE)) .

对比了能正确调用的接口和不能正确调用的区别,发现

[

object,

uuid(66F0009A-EAAC-4C78-9EF4-9617D49D50A2),

dual, //---------------------错误接口没有设置这个属性.

nonextensible,

helpstring(""),

pointer_default(unique)

]

interface IGDataBase : IDispatch{

................

}

加上dual 之后测试,通过.

使用webbrowser实现html表格操作需要引入mshtml.dll这个链接库。

1、比如有如下表格代码:

<table width="100%" >

<tr style="background-color:#c9e4ffline-height: 25px">

<th width="5%">序号</th>

<th width="15%">违章时间</th>

<th width="20%">违章地点</th>

<th width="40%">违章行为</th>

<th width="10%">执行机关</th>

<th width="10%">是否处理</th>

</tr>

</table>

2、用mshtml.dll提供的方法解析:

IHTMLDocument2 document = webbrower.Document.DomDocument as IHTMLDocument2

IHTMLElementCollection tables = (IHTMLElementCollection)document.all.tags("TABLE")

foreach (IHTMLTable table in tables)

{

IHTMLTableSection tts= table.tHead//因为TH标签是属于表格的表头信息;

foreach(IHTMLElement th in tts.rows)

{

System.Diagnostics.Debug.WriteLine(th.innerText)//遍历输出内容

}

}

解析HTML最好的类还是微软自己的在站内搜索的项目要进行HTML的解析,发现程序运行非常慢,一开始以为是lucene的问题,一测试大吃一惊,每一步lucene中AddDocument等只用了几十毫秒,而HTML解析竟然用了9秒。日志如下:2010-06-26 15:51:25,171 [8] DEBUG SearchSite.StartIndex - DownloadString:00:00:00.04823292010-06-26 15:51:34,187 [8] DEBUG SearchSite.StartIndex - ThreadParser:00:00:09.02364902010-06-26 15:51:34,187 [8] DEBUG SearchSite.StartIndex - DeleteDocuments:00:00:00.00000692010-06-26 15:51:34,203 [8] DEBUG SearchSite.StartIndex - AddDocument:00:00:00.0191071我使用的是Winista.HtmlParser这块网上找到的HTML解析器。遂准备更换解析器,但是用“.Net HTML Parser”在google上寻找,一直没找到合适的解析器,不是太难用,就是性能比Winista.HtmlParser还差,我才想到,微软的MSHTML不就是用来解析HTML的吗?折腾这么一圈却忘了微软自家的东西,微软的东西性能肯定差不了。添加对Microsoft.mshtml这个程序集的引用,然后编写如下代码:IHTMLDocument2 doc = new HTMLDocumentClass() doc.write(new object[]{pageSource}) doc.close() Title = doc.title Body = doc.body.innerText再测试,哇咔咔,快的要命,只有几十毫秒,2000个帖子一会儿就爬完了。日志如下:2010-06-26 16:26:35,546 [8] DEBUG SearchSite.StartIndex - DownloadString:00:00:00.04002632010-06-26 16:26:35,562 [8] DEBUG SearchSite.StartIndex - ThreadParser:00:00:00.02577312010-06-26 16:26:35,562 [8] DEBUG SearchSite.StartIndex - DeleteDocuments:00:00:00.00019132010-06-26 16:26:35,578 [8] DEBUG SearchSite.StartIndex - AddDocument:00:00:00.0010881HTMLDocumentClass的方法比任何一个网上找到的HTML解析器都丰富,想怎么搞就怎么搞,而且调用方法就是操作Dom的方法,完全不用再去学,哇咔咔,爽呆了。在使用的过程中遇到两个问题:1、VS2010中引用Microsoft.mshtml之后,要修改这个引用的“嵌入互操作类型”为False。2、调用doc.write方法的时候必须通过IHTMLDocument2接口来调用,否则报错“错误的类型”,在google上搜“type mismatch HTMLDocument write”