• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            <2008年3月>
            2425262728291
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統計

            • 隨筆 - 44
            • 文章 - 0
            • 評論 - 86
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類(31)

            隨筆檔案(44)

            Mining

            最新隨筆

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            獲取IE (控件)的所有鏈接(包括Frameset, iframe)

            IE 頂層 body 節點通過IHTMLElement->get_all 方法無法獲取iframe 里面的節點列表

            CComPtr<IHTMLElement> body;
             
            CComPtr
            <IDispatch> spDispCollection;
            body
            ->get_all(&spDispCollection);

            所以要獲取iframe/frame(frameset) 里面的節點列表的話, 則需要根據body/doc 找到frames, 然后從frames -> IHTMLWindow2 -> IHTMLDocument2 . 主要有2個方法, 下面是代碼片段
            方法一:
            IHTMLDocument2 *pDoc = 瀏覽器的Document(IWebBrowser2->IDispatch->IHTMLDocument2); 
            IHTMLWindow2 
            *pHTMLWnd = NULL; 
            IHTMLDocument2 
            *pFrameDoc=NULL; 
            IHTMLFramesCollection2 
            *pFramesCollection=NULL; 
            LPDISPATCH lpDispatch; 

            long p; 
            VARIANT varindex,varresult; 
            varresult.vt
            =VT_DISPATCH; 
            varindex.vt 
            = VT_I4; 
            if(pDoc!=NULL) 

                HRESULT hr
            =pDoc->get_frames(&pFramesCollection); 
                
            if(SUCCEEDED(hr)&&pFramesCollection!=NULL) 
                { 
                    hr
            =pFramesCollection->get_length(&p); 
                    
            if(SUCCEEDED(hr)) 
                        
            for(int i=0; i<p; i++
                        { 
                            varindex.lVal 
            = i; 
                            
            if(pFramesCollection->item(&varindex, &varresult) ==S_OK) 
                            { 
                                lpDispatch
            =(LPDISPATCH)varresult.ppdispVal; 
                                
            if (SUCCEEDED(lpDispatch->QueryInterface(IID_IHTMLWindow2, (LPVOID *)&pHTMLWnd))) 
                                { 
                                    
            if(SUCCEEDED(pHTMLWnd->get_document( &pFrameDoc))) 
                                    { 
                                        
            //work with the pFrameDoc 
                                    } 
                                    pHTMLWnd
            ->Release(); 
                                    pHTMLWnd
            =NULL; 
                                } 
                            } 
                        } 
                        pFramesCollection
            ->Release(); 
                } 
                pDoc
            ->Release(); 
            }

            方法二:
            CComQIPtr<IHTMLElement> pElem = ; // 可以遞歸上面的 CComPtr<IDispatch> spDispCollection 來得到
            CComBSTR bstrTagName;
            pElem
            ->get_tagName(&bstrTagName);
            if ( lstrcmpiW(L"IFRAME", bstrTagName)==0 ||
                    lstrcmpiW(L
            "FRAME", bstrTagName)==0 )
            {
                CComQIPtr
            <IHTMLFrameBase2>    _framebase2;
                CComPtr
            <IHTMLWindow2>        _framewindow;
                CComPtr
            <IHTMLDocument2>        _framedoc;
                
                
            if( (_framebase2 = spItem) 
                    
            && SUCCEEDED( _framebase2->get_contentWindow(&_framewindow) ) && _framewindow!=NULL 
                    
            && SUCCEEDED( _framewindow->get_document(&_framedoc) ) && _framedoc!=NULL )
                {
                    
            // 對 _framedoc 節點進行處理
                }
            }


            iframe 跨域訪問(cross frame)  zz from : http://codecentrix.blogspot.com/2007/10/when-ihtmlwindow2getdocument-returns.html 
            由于安全性限制, 為防止跨域腳本攻擊, 當frames 跨域的時候, IHTMLWindow2::get_document 調用將返回 E_ACCESSDENIED .
            下面函數 HtmlWindowToHtmlDocument  對于跨域的frame 通過 IHTMLWindow2 -> IID_IWebBrowserApp -> IHTMLWindow2 繞過了限制.

            // 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.
            CComQIPtr<IHTMLDocument2> HtmlWindowToHtmlDocument(CComQIPtr<IHTMLWindow2> spWindow)
            {
                 ATLASSERT(spWindow 
            != NULL);

                 CComQIPtr
            <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.
                 CComQIPtr<IWebBrowser2>  spBrws = HtmlWindowToHtmlWebBrowser(spWindow);
                 
            if (spBrws == NULL)
                 {
                      
            return CComQIPtr<IHTMLDocument2>();
                 }

                 
            // Get the document object from the IWebBrowser2 object.
                 CComQIPtr<IDispatch> spDisp;
                 hRes 
            = spBrws->get_Document(&spDisp);
                 spDocument 
            = spDisp;

                 
            return spDocument;
            }


            // Converts a IHTMLWindow2 object to a IWebBrowser2. Returns NULL in case of failure.
            CComQIPtr<IWebBrowser2> HtmlWindowToHtmlWebBrowser(CComQIPtr<IHTMLWindow2> spWindow)
            {
                 ATLASSERT(spWindow 
            != NULL);

                 CComQIPtr
            <IServiceProvider>  spServiceProvider = spWindow;
                 
            if (spServiceProvider == NULL)
                 {
                      
            return CComQIPtr<IWebBrowser2>();
                 }

                 CComQIPtr
            <IWebBrowser2> spWebBrws;
                 HRESULT hRes 
            = spServiceProvider->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&spWebBrws);
                 
            if (hRes != S_OK)
                 {
                      
            return CComQIPtr<IWebBrowser2>();
                 }

                 
            return spWebBrws;
            }


            附:
            IE(控件/接口)中主要有4個部分, Browser, Document, Frame/IFrame, Element , 其對應接口分別是
            Browser         -    IWebBrowser2
            Document      -    IHTMLDocument2
            Frame/IFrame-    IHTMLWindow2
            Element         -    IHTMLElement
            可以通過下面方法互相獲取
            browser      -> document        IWebBrowser2::get_Document
            document     -> frame           IHTMLDocument2::get_parentWindow
            frame        -> document        IHTMLWindow2::get_document
            frame        -> parent frame    IHTMLWindow2::get_parent
            frame        -> children frames IHTMLWindow2::get_frames
            element     -> Frame             IHTMLElement->QI(IHTMLFrameBase2) -> IHTMLFrameBase2->get_contentWindow -> IHTMLWindow2

            ref:
            在多Frame的網頁中怎么取出各個Frame的IHTMLDocument2的接口!急用.(高分)
            在文章 When IHTMLWindow2::get_document returns E_ACCESSDENIED 解決了iframe 跨域訪問的問題

            posted on 2008-07-30 19:17 泡泡牛 閱讀(7213) 評論(3)  編輯 收藏 引用 所屬分類: Develop

            評論

            # re: 獲取IE (控件)的所有鏈接(包括Frameset, iframe)  2008-08-01 19:00 小笨象

            樓主是否試過如果跨域的話,也能取到不?
            希望樓主能測試一下,然后告訴大家。
            謝謝。
              回復  更多評論    

            # re: 獲取IE (控件)的所有鏈接(包括Frameset, iframe)  2008-08-02 00:32 泡泡牛

            @小笨象

            http://codecentrix.blogspot.com/2007/10/when-ihtmlwindow2getdocument-returns.html

            這里已經解決了這個問題, 嘿嘿, 順便抄到了這里:)
              回復  更多評論    

            # re: 獲取IE (控件)的所有鏈接(包括Frameset, iframe)  2008-08-14 21:22 小笨象

            樓主。謝謝啊。
            我繼續學習。
              回復  更多評論    
            色综合久久中文字幕综合网| 精品久久人人妻人人做精品| 国产精品禁18久久久夂久 | 久久国产精品无| 亚洲狠狠婷婷综合久久蜜芽| 久久久久久久久无码精品亚洲日韩 | 思思久久精品在热线热| 久久久国产精品亚洲一区| 中文字幕亚洲综合久久2| 久久一区二区免费播放| 国内精品九九久久久精品| 热RE99久久精品国产66热| 99999久久久久久亚洲| 久久频这里精品99香蕉久| AA级片免费看视频久久| 天堂久久天堂AV色综合| 亚洲精品WWW久久久久久| 国产成人精品综合久久久| 久久精品亚洲一区二区三区浴池| 精品国产青草久久久久福利| 国产亚洲欧美成人久久片| 日本久久久久亚洲中字幕| 2020久久精品亚洲热综合一本| 国产视频久久| 国产成人久久久精品二区三区 | 久久久久亚洲精品日久生情| 久久国产免费直播| 66精品综合久久久久久久| 国产精品久久久亚洲| 国产人久久人人人人爽| 欧美大香线蕉线伊人久久| 亚洲AV无码久久精品蜜桃| 亚洲狠狠婷婷综合久久久久| 国内精品伊人久久久影院| 一本久久免费视频| 国内精品伊人久久久影院| 2019久久久高清456| 人妻精品久久久久中文字幕69| 亚洲色大成网站www久久九| 亚洲第一极品精品无码久久| 无码人妻久久一区二区三区免费丨|