2009-09-13 233 views
4

我寫了下面的代碼從當前網頁檢索所選文本:IHTMLSelectionObject.createRange()拋出UnauthorizedAccessException

IHTMLDocument2 mainDoc = ... 
for (int i = 0; i < mainDoc.frames.length; i++) { 
    object refIndex = i; 
    var frame = (IHTMLWindow2)mainDoc.frames.item(ref refIndex); 
    IHTMLDocument2 frameDoc; 
    try { 
     frameDoc = frame.document; 
    } catch (UnauthorizedAccessException ex) { 
     // Source: http://codecentrix.blogspot.com/2008/02/when-ihtmlwindow2document-throws.html 
     var sp = (IServiceProvider)frame; 

     // Use IServiceProvider.QueryService to get IWebBrowser2 object. 
     object brws = null; 
     sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out brws); 

     // Get the document from IWebBrowser2. 
     IWebBrowser2 browser = (IWebBrowser2)brws; 
     frameDoc = (IHTMLDocument2)browser.Document; 
    } 
    var range = frameDoc.selection.createRange() as IHTMLTxtRange; 
    if (!string.IsNullOrEmpty(range.text)) return range.text; 
} 
return string.Empty;

但在某些特定的網頁,調用frameDoc.selection.createRange()拋出UnauthorizedAccessException :

System.UnauthorizedAccessException was unhandled 
    Message="Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))" 
    Source="Microsoft.mshtml" 
    StackTrace: 
     at mshtml.IHTMLSelectionObject.createRange()

如何避免此錯誤?

+0

已經有一段時間了。但你有沒有解決這個問題? – Boydski 2010-11-30 18:10:12

+0

'frameDoc.selection.createRange()'不一定會返回一個IHTMLTxtRange - 可能首先查詢'selection.type'屬性?請參閱http://msdn.microsoft.com/en-us/library/aa768848%28v=vs.85%29.aspx – barrowc 2011-02-08 04:27:50

回答

1

這是預期的行爲,Cross-site scripting默認情況下處於禁用狀態,並且跨框架執行腳本,無論它們的域如何。

相關問題