RT
如果我新建了一个IE窗口的实例,并且导向一个含有frame框架的网页
之后我应该如何得到这个网页某个frame里面的内容呢?
下面是我写的例子
static void Main(string[] args)
{
object oMissing = System.Reflection.Missing.Value;
InternetExplorerClass myie = new InternetExplorerClass();
myie.Visible = true;
myie.Navigate("test.html", ref oMissing, ref oMissing, ref oMissing, ref oMissing);
IHTMLDocument2 doc = (IHTMLDocument2) myie.Document;
}
然后我想通过IHTMLDocument2的frames属性得到这个页面的frame集合,可是运行的时候报InvalidCastException.
不知道是什么问题,希望各位大大能帮助一下,谢谢了!
PS:
我如果用webbrowser控件来做,好像就不会出现那个exception。
如果我新建了一个IE窗口的实例,并且导向一个含有frame框架的网页
之后我应该如何得到这个网页某个frame里面的内容呢?
下面是我写的例子
static void Main(string[] args)
{
object oMissing = System.Reflection.Missing.Value;
InternetExplorerClass myie = new InternetExplorerClass();
myie.Visible = true;
myie.Navigate("test.html", ref oMissing, ref oMissing, ref oMissing, ref oMissing);
IHTMLDocument2 doc = (IHTMLDocument2) myie.Document;
}
然后我想通过IHTMLDocument2的frames属性得到这个页面的frame集合,可是运行的时候报InvalidCastException.
不知道是什么问题,希望各位大大能帮助一下,谢谢了!
PS:
我如果用webbrowser控件来做,好像就不会出现那个exception。
解决方案 »
- C# 禁止USB和光驱
- sql server 自增列问题
- 给大家出一个C#面试题,关于委托的
- c#读取xml文件,element 和 node的关系是什么?
- 大虾们帮帮忙啊,求你们了!
- 嵌入的资源读取失败,不知原因
- 什么是正则表达式
- 如何用水晶报表打印行高不固定的表格?
- C#怎样作串口通讯
- 如何更改我现有的代码,使其更具扩展性?
- 控件属性名中想使用变量
- 在窗体上点击检查框时激发CheckedChanged事件,但是在窗体的load事件中执行代码“checkBox1.Checked = true;”也会自动激发检查框的CheckedChanged事件,这是我所不希望的,如何避免自动激发检查框的Checked
这个一个安全问题,楼主可以搜索“Cross-Frame”查看相关资料。
-------------
贴出这段的核心代码
test.html
<html>
<FRAMESET border=0 frameSpacing=0 rows=61,*,15 frameBorder=0>
<FRAME name=frmtitle src="Test1.html">
</FRAMESET>
</html>test1.html
<html>
<body>
test page
</body>
</html>
{
object oMissing = System.Reflection.Missing.Value;
//InternetExplorerClass myie = new InternetExplorerClass();
InternetExplorer myie = new InternetExplorer();
myie.Visible = true;
myie.Navigate("C:\\Documents and Settings\\chewe06\\Desktop\\test.html", ref oMissing, ref oMissing, ref oMissing, ref oMissing);
IHTMLDocument2 doc = (IHTMLDocument2)myie.Document;
IHTMLFramesCollection2 frames = (IHTMLFramesCollection2) doc.frames;
object i = 0;
IHTMLFrameBase2 frame = (IHTMLFrameBase2) frames.item(ref i);//因为只有1个frame所以没有做循环
IHTMLWindow2 frameWnd = frame.contentWindow;
IHTMLDocument2 frameDoc = frameWnd.document;
MessageBox.Show(frameDoc.body.innerHTML);
}
这段代码执行到IHTMLFramesCollection2 frames = (IHTMLFramesCollection2) doc.frames 就报exception了
当然具体参考MSDN,如下代码测试通过:
myie.Visible = true;
myie.Navigate("C:\\Documents and Settings\\chewe06\\Desktop\\test.html", ref oMissing, ref oMissing, ref oMissing, ref oMissing);
IHTMLDocument2 doc = (IHTMLDocument2)myie.Document;
IHTMLFramesCollection2 frames = (IHTMLFramesCollection2)doc.frames;
object i = 0;
if (frames.length <= 0) return;
IHTMLWindow2 frame = frames.item(ref i) as IHTMLWindow2;
if (frame == null) return;
IHTMLDocument2 frameDoc = frame.document;
if (frameDoc == null) return;
MessageBox.Show(frameDoc.body.innerHTML);
IHTMLFramesCollection2 frames = (IHTMLFramesCollection2)doc.frames;
这一行就出错了,我看了一下仍然是InvalidCastException, 问题似乎是我得到的doc没办法得到frames属性
很诡异
static void Main()
{
object oMissing = System.Reflection.Missing.Value;
InternetExplorer myie = new InternetExplorer();
myie.Visible = true;
myie.Navigate("C:\\temp\\test.htm", ref oMissing, ref oMissing,
ref oMissing, ref oMissing);
IHTMLDocument2 doc = (IHTMLDocument2)myie.Document;
IHTMLFramesCollection2 frames = (IHTMLFramesCollection2)doc.frames;
object i = 0;
if (frames.length <= 0) return;
IHTMLWindow2 frame = frames.item(ref i) as IHTMLWindow2;
if (frame == null) return;
IHTMLDocument2 frameDoc = frame.document;
if (frameDoc == null) return;
MessageBox.Show(frameDoc.body.innerHTML);
}楼主可以把测试的2个html放到执行目录,将整个Demo工程打包发给我看看(wjhu111#21cn.com)。
{
[STAThread] // 原来控制台程序没有这句的缘故....
static void Main()
{
.........
}
}
结贴!
:)
IHTMLFramesCollection2 frames = (IHTMLFramesCollection2)doc.frames;
这行代码时提示doc.frames类型转换错误呢?