Asp.net中使用mshtml
在asp.net中使用mshtml Com组件
需要添加接口IPersistStreamInit
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace MsHtmlWeb
{
[ComVisible(true), ComImport(),
Guid("7FD52380-4E07-101B-AE2D-08002B2EC713"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistStreamInit
{
void GetClassID([In, Out] ref Guid pClassID);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int IsDirty();
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int Load([In] UCOMIStream pstm);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int Save([In] UCOMIStream pstm, [In,
MarshalAs(UnmanagedType.Bool)] bool fClearDirty);
void GetSizeMax([Out] long pcbSize);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int InitNew();
}
}
在asp.net页面中
namespace MsHtmlWeb
{
public partial class WebFormMSHtml : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
}
//mshtml.HTMLDocument objMSHTML = new mshtml.HTMLDocument();
//mshtml.IHTMLDocument2 objMSHTML2;
//mshtml.IHTMLDocument3 objMSHTML3;
//int x = 10;
////a dummy variable
////IPersistStreamInit objIPS;
//////here is the whole trick
////objIPS = (IPersistStreamInit)objMSHTML;
//objIPS.InitNew();
////you have to do it, if not you will always have readyState as "loading"
//objMSHTML2 = objMSHTML.createDocumentFromUrl(url, null);
//while (!(objMSHTML2.readyState == "complete"))
//{
// x = x + 1;
//}
//objMSHTML3 = (mshtml.IHTMLDocument3)objMSHTML2;
//IHTMLElementCollection d = objMSHTML3.getElementsByName("q");
//IHTMLElementCollection de = objMSHTML3.getElementsByName("btnG");
//HTMLInputElementClass cn = (HTMLInputElementClass)d.item("q", 0);
//cn.value = "biso";
//HTMLInputElementClass bt = (HTMLInputElementClass)de.item("btnG", 0);
//bt.click();
//// this does not fire
//string s = objMSHTML3.documentElement.innerHTML;
}
protected void Button1_Click(object sender, EventArgs e)
{
mshtml.HTMLDocument htmldoc;
//IHTMLDocument2 htmldoc;
htmldoc = new mshtml.HTMLDocument();
//htmldoc = new IHTMLDocument2();
mshtml.IHTMLDocument2 htmldoc2;
mshtml.IHTMLDocument3 htmldoc3;
IPersistStreamInit ips = (IPersistStreamInit)htmldoc;
ips.InitNew();
htmldoc2 = (mshtml.IHTMLDocument2)htmldoc.createDocumentFromUrl("http://www.baidu.com", null);
while (htmldoc2.readyState != "complete") ;
htmldoc3 = (mshtml.IHTMLDocument3)htmldoc2;
//Literal ltr = new Literal();
//ltr.Text = Server.HtmlEncode(htmldoc3.documentElement.innerHTML);
//Panel1.Controls.Add(ltr);
IHTMLElement he = htmldoc3.getElementById("kw");
he.setAttribute("value", "F555");
string s = htmldoc3.documentElement.innerHTML;
Label1.Text = s;//he.tagName+"z";
}
private void aa(string strString)
{
mshtml.HTMLDocument htmldocument=new HTMLDocument();
mshtml.IHTMLDocument2 doc = htmldocument.createDocumentFromUrl(strString, "");
//,mshtml.IHTMLDocument2
IHTMLElement2 element = doc.body as IHTMLElement2;
//string s=element.
//Dim htmldocument as New mshtml.htmldocument
//Dim doc As mshtml.IHTMLDocument2 =
//CType(htmldocument.createDocumentFromUrl(strString, ""),
//mshtml.IHTMLDocument2)
//Dim timeout As DateTime = Now
//Do Until htmldocument.readyState = "complete" Or Now.Subtract
//(timeout).TotalSeconds >= 4
//System.Threading.Thread.CurrentThread.Sleep(100)
//Loop
}
protected void Button2_Click(object sender, EventArgs e)
{
mshtml.HTMLDocument htmldoc;
//IHTMLDocument2 htmldoc;
htmldoc = new mshtml.HTMLDocument();
//htmldoc = new IHTMLDocument2();
mshtml.IHTMLDocument2 htmldoc2;
mshtml.IHTMLDocument3 htmldoc3;
IPersistStreamInit ips = (IPersistStreamInit)htmldoc;
ips.InitNew();
htmldoc2 = (mshtml.IHTMLDocument2)htmldoc.createDocumentFromUrl("http://baidu.lehecai.com/lottery/draw/view/200", null);
while (htmldoc2.readyState != "complete") ;
htmldoc3 = (mshtml.IHTMLDocument3)htmldoc2;
IHTMLElement he = htmldoc3.getElementById("jq_latest_draw_result");
string strLast = string.Empty;
if (!string.IsNullOrEmpty(he.innerText))
{
strLast = he.innerText.Trim();
}
if (!string.IsNullOrEmpty(strLast))
{
string[] strList = strLast.Split(new char[] { ' ' });
string aa = string.Empty;
foreach (var item in strList)
{
aa += item + ",";
}
if (aa.EndsWith(","))
aa = aa.TrimEnd(new char[] { ',' });
Label2.Text = aa;
}
//
}
}
}
发生错误解决
在vs2010中运行HTMLDocumentClass doc =new HTMLDocumentClass(); 会出现Interop type 'mshtml.HTMLDocumentClass' cannot be embedded. Use the applicable interface instead.的编译错误。原因是我们添加 Microsoft.mshtml的时候,由于mshtml.dll太大,微软设置了这个属性Embed Interop Type =true .
解决的办法是:直接去掉Class后缀。