• <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年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統計

            • 隨筆 - 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 泡泡牛 閱讀(7214) 評論(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 小笨象

            樓主。謝謝啊。
            我繼續學習。
              回復  更多評論    
            久久亚洲电影| 久久久久久av无码免费看大片| 久久久无码精品午夜| 麻豆久久久9性大片| 国产精品久久久久国产A级| 99麻豆久久久国产精品免费| 久久精品国产色蜜蜜麻豆 | 亚洲精品白浆高清久久久久久 | 久久精品国产精品青草| 日本国产精品久久| 亚洲国产精品无码久久98| 久久er国产精品免费观看8| 久久久久人妻精品一区| 人妻无码久久精品| 国产叼嘿久久精品久久| 亚洲αv久久久噜噜噜噜噜| 久久久久国产日韩精品网站| 久久99精品久久只有精品| 久久91精品国产91| 精品久久人人妻人人做精品| 久久人人妻人人爽人人爽| 欧美日韩精品久久久免费观看| 97精品久久天干天天天按摩| 伊人久久大香线蕉AV色婷婷色 | 国产L精品国产亚洲区久久| 精品一二三区久久aaa片| 久久99精品国产麻豆蜜芽| 91久久九九无码成人网站| 大伊人青草狠狠久久| 国产精品久久久久aaaa| 亚洲欧美成人综合久久久| 精品国产青草久久久久福利| 色妞色综合久久夜夜| 一本色道久久综合| 亚洲国产成人久久一区WWW| 久久天天躁狠狠躁夜夜2020| 成人午夜精品久久久久久久小说| 久久99精品国产99久久6男男| 国产成人综合久久综合| 狠狠色丁香久久综合五月| 国产成人综合久久综合|