2012-11-26 7 views
2

나는 반대 할 것입니다이 코드를 가지고 : 도착 iframe이 element 주어진 자식 문서 :상위 도메인의 iframe 요소를 iframe 간 도메인의 하위 문서에서 가져 오는 방법은 무엇입니까?

var htmlWindow = (element as IHTMLFrameBase2).contentWindow; 
if (htmlWindow == null) return null; 
// Convert IHTMLWindow2 to IWebBrowser2 using IServiceProvider. 
IServiceProvider sp = (IServiceProvider)htmlWindow; 
// Use IServiceProvider.QueryService to get IWebBrowser2 object. 
Object brws = null; 
//brws = 
sp.QueryService(ref IID_IWebBrowserApp, ref IID_IWebBrowser2, out brws); 
// Get the document from IWebBrowser2. 
SHDocVw.IWebBrowser2 browser = (SHDocVw.IWebBrowser2)(brws); 
return (IHTMLDocument2)browser.Document; 

내 질문에 내가 반대 할 수있는 방법입니다?

Object frameWindow; 
IServiceProvider isp = (IServiceProvider)document.parentWindow; 
isp.QueryService(ref IID_IWebBrowserApp, ref IID_IHTMLFrameBase, out frameWindow); 
다음

참조에 대한 모든 GUID를 다음과 같습니다 :이 아이 document을 부여하지만 난 널 frameWindow 얻고 일을 시도 여기

private static Guid IID_IWebBrowserApp = new Guid("0002DF05-0000-0000-C000-000000000046"); 
private static Guid IID_IWebBrowser2 = new Guid("D30C1661-CDAF-11D0-8A3E-00C04FC9E26E"); 
private static Guid IID_IHTMLFrameBase2 = new Guid("3050F6DB-98B5-11CF-BB82-00AA00BDCE0B"); 
private static Guid IID_IHTMLFrameBase = new Guid("3050F311-98B5-11CF-BB82-00AA00BDCE0B"); 
private static Guid IID_IHTMLWindow2 = new Guid("332C4427-26CB-11D0-B483-00C04FD90119"); 

그리고 나의 IServiceProvider입니다 :

[ComImport(), ComVisible(true), Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), 
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] 
private interface IServiceProvider 
{ 
    [return: MarshalAs(UnmanagedType.I4)] 
    [PreserveSig] 
    int QueryService(ref Guid guidService, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppvObject); 
} 

답변

0

사실 실제로는 기본 브라우저에서 Iframe 문서/요소를 가져올 수 없습니다. javascript를 실행해야합니다. 필자는 내 웹 사이트에서 운좋게 jquery를 사용할 수 있었기 때문에 다음 if express를 사용하여 내부 iframe 중 하나에서 텍스트를 가져 왔습니다. 당신이 정말로 당신의 대상은 iframe 내부의 요소의 HTML로 뭔가를하려는 경우 다음 acutally의 HTML을 잡아해야 다음에 빈 요소를 생성, 귀하의 경우에는

var tmp = browser.Document.InvokeScript("eval", new object[] { "$(\"#iframe_id\").contents().find('#element').html())" }); 

:

나는 이런 짓을 메인 브라우저 창을 열고 html을 업데이트하여 물건을 가져 오십시오.

내가 지금까지 발견 한 유일한 방법입니다.