C#中webBrowser加载页面中的不同域的iFrame的源代码的取得

作者: Nishizhen 分类: 杂七杂八 发布时间: 2010-03-03 17:04 ė 61条评论
webBrowser1.Document.Window.Frames[0].Document”引发了“System.UnauthorizedAccessException”类型的异常 System.Windows.Forms.HtmlDocument {System.UnauthorizedAccessException} 

{"拒绝访问。 (异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))"} System.SystemException {System.UnauthorizedAccessException}

最近这个跨域的安全问题很困扰,搞了好久,终于在朋友的帮助下找到了一个C++的方法HtmlWindowToHtmlWebBrowser

CComPtr<IWebBrowser2> CTimerSerachDlg::HtmlWindowToHtmlWebBrowser(CComPtr<IHTMLWindow2> spWindow)
{     
    ATLASSERT(spWindow != NULL);     
    CComQIPtr<IServiceProvider>  spServiceProvider = spWindow;     
    if (spServiceProvider == NULL)     
    {          
        return CComPtr<IWebBrowser2>();     
    }     
    CComPtr<IWebBrowser2> spWebBrws;     
    HRESULT hRes = spServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&spWebBrws);     
    if (hRes != S_OK)     
    {          
        return CComPtr<IWebBrowser2>();     
    }     
    return spWebBrws;
}

// Converts a IHTMLWindow2 object to a IHTMLDocument2. Returns NULL in case of failure.
// It takes into account accessing the DOM across frames loaded from different domains.
CComPtr<IHTMLDocument2> CTimerSerachDlg::HtmlWindowToHtmlDocument(CComPtr<IHTMLWindow2> spWindow)
{     
    ATLASSERT(spWindow != NULL);     
    CComPtr<IHTMLDocument2> spDocument;     
    HRESULT hRes = spWindow->get_document(&spDocument);         
    if ((S_OK == hRes) && (spDocument != NULL))     
    {          
        // The html document was properly retrieved.          
        return spDocument;     
    }     
    // hRes could be E_ACCESSDENIED that means a security restriction that     
    // prevents scripting across frames that loads documents from different internet domains.     
    CComPtr<IWebBrowser2>  spBrws = HtmlWindowToHtmlWebBrowser(spWindow);     
    if (spBrws == NULL)     
    {         
        return CComPtr<IHTMLDocument2>();     
    }     
    // Get the document object from the IWebBrowser2 object.     
    CComPtr<IDispatch> spDisp;     hRes = spBrws->get_Document(&spDisp);    
    spDocument = spDisp;     
    return spDocument;
}

在后来找到了作者的Blog,但是国内屏蔽了blogspot,直接不能够访问。

然后发现了作者的另外一篇文章:http://codecentrix.blogspot.com/2008/02/when-ihtmlwindow2document-throws.html

C# 跨域访问iframe的办法:http://www.codecentrix.com/blog/wnd2doc_csharp/GetDocumentFromWindowCsharp.zip

IHTMLWindow2 htmlWindow = (IHTMLWindow2)(((HTMLDocumentClass)(webBrowser1.Document.DomDocument)).frames.item(ref index));
label1.Text = CodecentrixSample.CrossFrameIE.GetDocumentFromWindow(htmlWindow).activeElement.innerHTML;

取到结果,开心。嘎嘎。

本文出自 逆时针's Place,转载时请注明出处及相应链接。

本文永久链接: http://www.nishizhen.cn/c%e4%b8%adwebbrowser%e5%8a%a0%e8%bd%bd%e9%a1%b5%e9%9d%a2%e4%b8%ad%e7%9a%84%e4%b8%8d%e5%90%8c%e5%9f%9f%e7%9a%84iframe%e7%9a%84%e6%ba%90%e4%bb%a3%e7%a0%81%e7%9a%84%e5%8f%96%e5%be%97/

一条评论

  1. 繁体字 2011年12月25日 11:35

    试了一下,很不错。 3q

发表评论

电子邮件地址不会被公开。 必填项已用*标注

验证码 * Time limit is exhausted. Please reload CAPTCHA.

Ɣ回顶部