2009-09-13 7 views
4

j'ai écrit le code suivant pour récupérer le texte sélectionné à partir de la page Web en cours:IHTMLSelectionObject.createRange() renvoie 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;

Mais sur certaines pages Web, l'appel à frameDoc.selection.createRange() renvoie une UnauthorizedAccessException :

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

Comment puis-je éviter cette erreur?

+0

Ça fait longtemps. Mais as-tu déjà résolu ça? – Boydski

+0

'frameDoc.selection.createRange()' ne renvoie pas nécessairement un IHTMLTxtRange - peut-être d'abord interroger la propriété 'selection.type'? Voir http://msdn.microsoft.com/en-us/library/aa768848%28v=vs.85%29.aspx – barrowc

Répondre

1

Ce comportement est attendu, Cross-site scripting est désactivé par défaut et vous exécutez des scripts sur des cadres quel que soit leur domaine.

Questions connexes