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。

解决方案 »

  1.   

    如果frame跨域(子页面域名和主页面域名不同)则不能访问。
    这个一个安全问题,楼主可以搜索“Cross-Frame”查看相关资料。
      

  2.   

    你可以把测试的两个html代码贴出来看看。
      

  3.   

    然后我想通过IHTMLDocument2的frames属性得到这个页面的frame集合,可是运行的时候报InvalidCastException
    -------------
    贴出这段的核心代码
      

  4.   

    应该不涉及到跨域的问题吧,因为test.html和frame里面的test1.html都是我在本地的文件, 代码如下:
    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>
      

  5.   

    static void Main(string[] args)
            {
                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了
      

  6.   

    关键是frames.item()得到的是IHTMLWindow对象而不是IHTMLFrameBase对象
    当然具体参考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);
      

  7.   

    我刚刚试过了用你的代码,可是我现在碰到的问题似乎并不是出在调用frames.item(),而是在之前的
    IHTMLFramesCollection2 frames = (IHTMLFramesCollection2)doc.frames;
    这一行就出错了,我看了一下仍然是InvalidCastException, 问题似乎是我得到的doc没办法得到frames属性
    很诡异
      

  8.   

    我的测试环境是:xp、ie7、vs2005
    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)。
      

  9.   

    static class Program
    {
        [STAThread] // 原来控制台程序没有这句的缘故....
        static void Main()
        {
    .........
        }
    }
      

  10.   

    多谢zswang大大的帮助,虽然我现在还弄不太清楚[STAThread]这个关键字的意思,但是现在问题确实解决了~
    结贴!
    :)
      

  11.   

    为什么我在执行到
    IHTMLFramesCollection2 frames = (IHTMLFramesCollection2)doc.frames;
    这行代码时提示doc.frames类型转换错误呢?