• <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>

            yehao's Blog

            如何對webbrowser和IE編程(七)

            目錄(?)[-]

            1. 加入高級功能
              1. 從ActiveX 控件中訪問Internet Explorer 的IWebBrowser2
                1. 利用一個控件打印web頁
                2. PrintCtl.htm
              2. 當宿主WebBrowser控件的時候存取幀的IWebBrowser2 接口
              3. 調(diào)用 查找, 察看源碼, 以及 Internet 選項
            2. 分發(fā)WebBrowser 控件

            加入高級功能

            本節(jié)將展示如何加入高級功能到你的應(yīng)用程序或者ActiveX控件.將展示如何從一個ActiveX控件中訪問Internet Explorer的 IWebBrowser2,以及如何從一個Web頁面的frame中獲得WebBrowser 對象。將會展示實現(xiàn)一些并非容易實現(xiàn)的功能.本節(jié)有一定難度.所有代碼采用C++ 和COM實現(xiàn),你應(yīng)當有一定堅實的基礎(chǔ)才可以完成本節(jié)的理解

            從ActiveX 控件中訪問Internet Explorer 的IWebBrowser2

            在Activx控件中訪問IWebBrowser2 接口提供了用戶定制瀏覽器的能力,雖然以此作為自己的控件功能不大光明,且你只能夠在VC編寫的activeX控件中訪問。(盡管可以在VB寫的控件中訪問document和window控件,但是你不可以直接訪問WebBrowser 自身) .

            存取  IWebBrowser2 接口經(jīng)過四個步驟:

            1.    在類文件中包含 ExDisp.h .

            2.       調(diào)用控件的站點的IOleClientSite::GetContainer 方法,該方法返回由Internet Explorer.實現(xiàn)的IOleContainer 接口的指針。

            3.       如果步驟2成功,用 IOleContainer 指針查詢IServiceProvider 接口。.

            4.       如果步驟成功調(diào)用IServiceProvider 的方法QueryService 的到 IWebBrowser2 接口。

            QueryService 方法攜帶3個參數(shù). 第一個參數(shù)指定你想訪問的服務(wù)。為得到IWebBrowser2指針, 需要指定SID_SInternetExplorer 或者SID_SWebBrowserApp 來指定要訪問的服務(wù). (現(xiàn)階段,他們?nèi)慷x為IID_IWebBrowserApp.) 第二個參數(shù)指定你想接收的接口的ID。此參數(shù)你應(yīng)當指定為IID_IWebBrowser2. 最后,第三個參數(shù)你需要指定哪一個變量接收返回的接口指針。

            Call any method or property of IWebBrowser2. 當完成后,確信你已經(jīng)釋放掉你獲取的接口指針.以下為代碼參數(shù).

            ////////////////////////////////////////////////////////
            // Begin Step 1
             

             

            #include <ExDisp.h>
            #include <shlguid.h>
             

             

            // End Step 1
            ////////////////////////////////////////////////////////
             

             

            CSomeClass::SomeMethod(){
             

             

            ////////////////////////////////////////////////////////
            // Begin Step 2
             

             

            IOleContainer* pContainer;
             

             

            // m_pClientSite is a pointer to IOleClientSite.
            // This is the client site for your control.
            //
            HRESULT hr = m_pClientSite->GetContainer(&pContainer);
            if (FAILED(hr))
               return hr;
             

             

            // End Step 2
            ////////////////////////////////////////////////////////
             

             

            ////////////////////////////////////////////////////////
            // Begin Step 3
             

             

            IServiceProvider* pServiceProvider;
             

             

            hr = pContainer->QueryInterface(IID_IServiceProvider,
                                            (void**)&pServiceProvider);
            pContainer->Release();
             

             

            if (FAILED(hr))
               return hr;
             

             

            // End Step 3
            ////////////////////////////////////////////////////////
             

             

             

             

            ////////////////////////////////////////////////////////
            // Begin Step 4
             

             

            IWebBrowser2* pWebBrowser;
             

             

            hr = pServiceProvider->QueryService(SID_SWebBrowserApp,
                                       IID_IWebBrowser2,
                                       (void**)&pWebBrowser);
            pServiceProvider->Release();
             

             

            if (FAILED(hr))
               return hr;
             

             

            // End Step 4
            ////////////////////////////////////////////////////////
             

             

             

             

            ////////////////////////////////////////////////////////
            // Begin Step 5
             

             

            // Call some IWebBrowser2 methods and/or properties.
             

             

            // End Step 5
            ////////////////////////////////////////////////////////
            }

            利用一個控件打印web頁

            早于5的Internet Explorer,通常用于ActiveX中 訪問IWebBrowser2 接口以提供打印web頁面的功能。盡管ie5允許你直接在web頁的script中使用 window.print, 但是建立一個提供打印web頁的功能的示范還是比較好教您使用IWebBrowser2接口的入門教程.在此之前,必要知道如何使用ATL建立一個activeX控件以實現(xiàn)打印功能. 關(guān)于此點,我將認為您已經(jīng)知道如何使用ATL創(chuàng)建一個控件.

            啟動Visual C++, 新建 ATL DLL工程. 你可將工程命名為 AtlPrint. 下一步, 使用Wizard增加一個Lite Control 到你的工程。 你可以命名你的控件為PrintCtl. 為IPrintCtl 接口添加一個方法Print. 之后你將在腳本中使用此方法打印當前Web page.

            在實現(xiàn)Print 方法前,首先包含ExDisp.h 和 shlguid.h 頭文件到PrintCtl.cpp 實現(xiàn)文件.

            下一步使用之前給出的獲取IWebBrowser2 接口的方法獲得接口并調(diào)用ExecWB 以實現(xiàn)打印當前Web頁. 你可以使用ATL 智能接口指針類—CComPtr 以及 CComQIPtr—以實現(xiàn)查詢接口處理引用次數(shù)等艱苦的工作.此處為智能指針示勇代碼:

            STDMETHODIMP CPrintCtl::Print()
            {
               HRESULT hr = E_FAIL;
             

             

               if (m_spClientSite)
               {
                  CComPtr<IOleContainer> spContainer;
               
                  hr = m_spClientSite->GetContainer(&spContainer);
                  ATLASSERT(SUCCEEDED(hr));
             

             

                  if (SUCCEEDED(hr))
                  {
                     CComQIPtr<IServiceProvider, &IID_IServiceProvider>
                        spServiceProvider(spContainer);
             

             

                     ATLASSERT(spServiceProvider);
             

             

                     if (!spServiceProvider)
                        hr = E_FAIL;
                     else
                     {
                        CComPtr<IWebBrowser2> spWebBrowser;
             

             

                        hr = spServiceProvider->QueryService(SID_SInternetExplorer,
                                                             IID_IWebBrowser2,
                                                             (void**)&spWebBrowser);
                        ATLASSERT(SUCCEEDED(hr));
             

             

                        if (SUCCEEDED(hr))
                        {         
                           spWebBrowser->ExecWB(OLECMDID_PRINT, 
                                             OLECMDEXECOPT_PROMPTUSER,
                                             NULL, NULL);
                        }
                     }
                  }
               }
             

             

               return hr;
            }

            現(xiàn)在編譯ATL ActiveX control. 為測試打印功能,你必須加入一些script. Listing 6-2 展示了這部分代碼:

            Listing 6-2.

            PrintCtl.htm

            <HTML>
            <HEAD>
               <TITLE>ATL 3.0 test page for object PrintCtl</TITLE>
             

             

               <SCRIPT LANGUAGE="VBS">
                  Sub btnPrint_onclick
                     PrintCtl.Print
                  End Sub
               </SCRIPT>
            </HEAD>
            <BODY>
               <OBJECT ID="PrintCtl"
                  CLASSID="CLSID:320B04E4-B55B-11D2-A9BA-444553540001">
               </OBJECT>
               <P>
               <BUTTON ID="btnPrint">Print Page</BUTTON>
            </BODY>
            </HTML>

            當宿主WebBrowser控件的時候存取幀的IWebBrowser2 接口

            如果一個Web 頁包含了多幀,每一幀都包含了一個WebBrowser 對象。 當宿主WebBrowser 控件, 你將可被允許從應(yīng)用程序訪問WebBrowser 以控制幀.此控允許你控制以在幀中導(dǎo)航, 刷新, 以及諸如此類。一旦你擁有了一個幀中的 WebBrowser 對象的IWebrowser2 接口指針, 你可以掉用IWebrowser2 接口的任何方法和屬性。

            在VC++中你可以訪問一個幀中的WebBrowser. VB中,你可在幀中存取document , 你可以訪問WebBrowser 但是不可以訪問裝載于WebBrowser窗口中的HTML文檔對象的 IoleContainer 接口. 存取 IOleContainer 要求訪問幀的 WebBrowser 對象. 本節(jié)講述VC++d的標準技術(shù)細節(jié),即WebBrowser 控件的宿主能訪問在包含的WebBrowser控件裝載的web頁面的幀窗口的WebBrowser對象模型.

            下面的代碼展示如何訪問web頁面的每一個幀的WebBrowser對象以刷新每一幀的內(nèi)容.其中重要的片斷用于用HTML document 對象的IOleContainer::EnumObjects  方法枚舉頁面中的embeddings(嵌入)對象. 每一個嵌入對象表現(xiàn)為一個控件. 利用IWebBrowser2 接口查詢每一個控件對象,此代碼可檢測到控件是否是一個子幀.如果為獲得 IWebBrowser2 而成功調(diào)用QueryInterface, 其結(jié)果為幀中的WebBrowser對象的引用. (數(shù)據(jù)成員m_webBrowser 是CWebBrowser2 類型的—MFC 包裝類)

            // Get the IDispatch of the document.
            //
            LPDISPATCH lpDisp = NULL;
            lpDisp = m_webBrowser.GetDocument();
             

             

            if (lpDisp)
            {
               IOleContainer* pContainer;
             

             

               // Get the container.
               //
               HRESULT hr = lpDisp->QueryInterface(IID_IOleContainer,
                                                   (void**)&pContainer);
               lpDisp->Release();
             

             

               if (FAILED(hr))
                  return hr;
             

             

               // Get an enumerator for the frames.
               //
               IEnumUnknown* pEnumerator;
             

             

               hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
               pContainer->Release();
             

             

               if (FAILED(hr))
                  return hr;
             

             

               IUnknown* pUnk;
               ULONG uFetched;
             

             

               // Enumerate and refresh all the frames.
               //
               for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
               {
                  // QI for IWebBrowser here to see whether we have 
                  // an embedded browser.
                  IWebBrowser2* pWebBrowser;
             

             

                  hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pWebBrowser);
                  pUnk->Release();
             

             

                  if (SUCCEEDED(hr))
                  {
                     // Refresh the frame.
                     pWebBrowser->Refresh();
                     pWebBrowser->Release();
                  }
               }
             

             

               pEnumerator->Release();
            }

            請留意在代碼中我們首先通過GetDocument 方法獲得了文檔的IDispatch 對象指針, 該方法是WebBrowser 包裝類的成員指針.然后我們訪問文檔的IOleContainer 接口. IOleContainer 接口提供了能夠枚舉頁面中全部嵌入對象的功能. 然后我們通過調(diào)用IOleContainer 的EnumObjects 方法得到枚舉器(EnumObjects. EnumObjects 返回的 IEnumUnknown 接口的指針可以用于枚舉全部嵌入(embeddings)對象. 代碼的下一步, 我們遍歷全部嵌入對象,查詢每一個對象的IWebBrowser2 接口. 如果查詢成功, 我們已經(jīng)獲得了幀的IWebBrowser2 接口指針.我們可以調(diào)用它的任何方法和屬性,在此例中,我們僅僅調(diào)用了每一個幀的Refresh.

            忠告


            ActiveX 控件宿主于一個html頁也有類似情。也許,如果你建立一個訪問ieWebBrowser 控件或者頁面幀中的WebBrowser 的控件,不要將你的控件標記為腳本安全和初始化安全。.

            調(diào)用 查找, 察看源碼, 以及 Internet 選項

            瀏覽WebBrowser 控件的方法和屬性, 你可輕易見到控件提供的功能.但是3個可編程由WebBrowser控件提供的項目不容易發(fā)覺到:查找對話框, 察看源代碼菜單項,以及Internet選項對話框. 如果你曾經(jīng)用過ie,你無疑很熟悉他們. 查找對話框, 允許你在WEB頁中查找文本,通過處理 Ctrl-F 或者選擇edit菜單的Find項來調(diào)用.

            察看源代碼菜單項,允許你顯示W(wǎng)EB頁的html代碼, 可通過選擇View菜單的Source項來選擇或者右擊web頁(在彈處菜單中)選擇察看源代碼. Internet 選項對話框如圖6-23所示, 可通過選擇Tools菜單的Internet Option項來調(diào)用.

            Figure 6-23. Internet Options dialog box.

            能夠在你的web應(yīng)用中提供以上功能的確可以帶來對用戶的友善性,但是調(diào)用途徑缺不是通過WebBrowser的方法和屬性可以實現(xiàn). 實際上你應(yīng)當從調(diào)用IOleCommandTarget 的Exec 方法來調(diào)用實現(xiàn)于WebBrowser中的以上功能.當調(diào)用Exec, 你傳遞名為 CGID_IWebBrowser 的GUID 作為你想調(diào)用的命令的ID.盡管ExecWB 方法是IOleCommandTarget::Exec 方法的包裝, 但是你不能夠通過ExecWB 來調(diào)用 Find, View Source, 或者 Internet Options 對話框,以為ExecWB 不允許你指定命令組GUID. 那意味著該項技術(shù)僅能夠用于VC++—你不能夠直接從VB中調(diào)用。.

            忠告


            本代簡要展示你未收入文檔的命令組GUID ,那意味著可以將來改編。盡管代碼已經(jīng)在Internet Explorer 3.x, 4.x 5中測試,,但是不保證在將來的版本中成功運行

            以下步驟實現(xiàn) Find, View Source, 以及Internet Options 命令:

            1.    定義WebBrowser 控件的命令組GUID:

            DEFINE_GUID(CGID_IWebBrowser,0xED016940L,0xBD5B,0x11cf,0xBA,
                     0x4E,0x00,0xC0,0x4F,0xD7,0x08,0x16);

            2.       定義用于Find, View Source,  Internet OptionsID:

                 
                 #define HTMLID_FIND 1
                 #define HTMLID_VIEWSOURCE 2
                 #define HTMLID_OPTIONS 3

            3.       在需要的時候執(zhí)行Find, View Source, Internet Options 命令舉例來說,你可創(chuàng)建工具方法接收命令ID并調(diào)用 IOleCommandTarget::Exec如下片斷所示. (注意在MFC代碼中,m_webBrowser  WebBrowser 控件的實例同樣nCmdID 是定義的ID)

            HRESULT CYourView::ExecCmdTarget(DWORD nCmdID)
            {
               LPDISPATCH lpDispatch = NULL;
               LPOLECOMMANDTARGET lpOleCommandTarget = NULL;
               HRESULT hr = E_FAIL;
             

             

               // Get the IDispatch of the document.
               //
               lpDispatch = m_webBrowser.GetDocument();
               ASSERT(lpDispatch);
             

             

               if (lpDispatch)
               {
                  // Get a pointer for the IOleCommandTarget interface.
                  //
                  hr = lpDispatch->QueryInterface(IID_IOleCommandTarget,
                                                  (void**)&lpOleCommandTarget);
                  lpDispatch->Release();
             

             

                  ASSERT(lpOleCommandTarget);
             

             

                  if (SUCCEEDED(hr))
                  {
                     // Invoke the given command id 
                     // for the WebBrowser control.
                     hr = lpOleCommandTarget->Exec
                          (pguidCmdGroup, nCmdID, 0, NULL, NULL);
                     lpOleCommandTarget->Release();
                  }
               }
             

             

               return hr;
            }

             

             

             

             

             

             

             

             

             

             

             

             

            分發(fā)WebBrowser 控件

            現(xiàn)在你知道了如何利用WebBrowser控件和IE創(chuàng)建專用應(yīng)用程序, 你大概感興趣知道那些IE組件你需要打包在你的應(yīng)用程序以便你的應(yīng)用程序可以在系統(tǒng)商正常工作即使沒有IE5被安裝.無論你宿主 WebBrowser 控件還是自動化Internet Explorer, 你必須至少打包IE最小化安裝的組件. 為理解為什么,請再一次察看圖6-1展示的體系.你可以看到每一個組件是如何的依賴其他組件—而且這幅圖僅僅展示了其表面.它未能展示webbrowser控件和IE多樣特性的組件間的全部特征.因為由如此眾多的組件調(diào)用,為了你的應(yīng)用程序能夠正常工作,你應(yīng)當確信至少IE最小化安裝于用戶的操作系統(tǒng).

            別擔心,你不需要打包每一個IE的組件.  Internet Explorer 5 安裝程序允許你定制你的安裝以使你打包你僅需的組件.另外, 如果你使用Internet Explorer Administration Kit (可在http://ieak.microsoft.com/找到) 建立你的安裝程序, 你可以將IE默認安裝,免掉多個確認安裝步驟的對話框.

            posted on 2012-09-22 21:46 厚積薄發(fā) 閱讀(862) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導(dǎo)航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            久久最新免费视频| 国内精品久久久久久野外| 久久久久久久久66精品片| 一本一本久久aa综合精品| 久久综合久久综合九色| 中文字幕人妻色偷偷久久| 亚洲综合婷婷久久| 久久免费的精品国产V∧| 天天做夜夜做久久做狠狠| 国产欧美久久一区二区| 久久久国产视频| 热久久国产精品| 久久国产精品99精品国产| 日韩欧美亚洲综合久久| 久久精品国产精品国产精品污 | 国产精品美女久久久久av爽| 国产69精品久久久久APP下载 | 无码超乳爆乳中文字幕久久| 久久丝袜精品中文字幕| 丁香狠狠色婷婷久久综合| 亚洲AV无码一区东京热久久| 一本色综合久久| 久久国产视频网| 久久国产热这里只有精品| 国产亚州精品女人久久久久久| 久久青青草原亚洲av无码app| 天天躁日日躁狠狠久久| 亚洲精品无码久久一线| 久久无码AV中文出轨人妻| 亚洲人成无码网站久久99热国产 | 精品人妻伦一二三区久久| 欧美777精品久久久久网| 精品久久8x国产免费观看| 久久99国产综合精品女同| 免费无码国产欧美久久18| 久久精品一区二区三区中文字幕| 国产精品成人99久久久久| 国産精品久久久久久久| 精品久久久久久久中文字幕| 精品人妻伦一二三区久久| 伊人久久大香线蕉精品不卡|