青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

yehao's Blog

如何對webbrowser和IE編程(七)

目錄(?)[-]

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

加入高級功能

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

從ActiveX 控件中訪問Internet Explorer 的IWebBrowser2

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

存取  IWebBrowser2 接口經過四個步驟:

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

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

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

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

QueryService 方法攜帶3個參數. 第一個參數指定你想訪問的服務。為得到IWebBrowser2指針, 需要指定SID_SInternetExplorer 或者SID_SWebBrowserApp 來指定要訪問的服務. (現階段,他們全部定義為IID_IWebBrowserApp.) 第二個參數指定你想接收的接口的ID。此參數你應當指定為IID_IWebBrowser2. 最后,第三個參數你需要指定哪一個變量接收返回的接口指針。

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

////////////////////////////////////////////////////////
// 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控件以實現打印功能. 關于此點,我將認為您已經知道如何使用ATL創建一個控件.

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

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

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

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;
}

現在編譯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 控件, 你將可被允許從應用程序訪問WebBrowser 以控制幀.此控允許你控制以在幀中導航, 刷新, 以及諸如此類。一旦你擁有了一個幀中的 WebBrowser 對象的IWebrowser2 接口指針, 你可以掉用IWebrowser2 接口的任何方法和屬性。

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

下面的代碼展示如何訪問web頁面的每一個幀的WebBrowser對象以刷新每一幀的內容.其中重要的片斷用于用HTML document 對象的IOleContainer::EnumObjects  方法枚舉頁面中的embeddings(嵌入)對象. 每一個嵌入對象表現為一個控件. 利用IWebBrowser2 接口查詢每一個控件對象,此代碼可檢測到控件是否是一個子幀.如果為獲得 IWebBrowser2 而成功調用QueryInterface, 其結果為幀中的WebBrowser對象的引用. (數據成員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 接口提供了能夠枚舉頁面中全部嵌入對象的功能. 然后我們通過調用IOleContainer 的EnumObjects 方法得到枚舉器(EnumObjects. EnumObjects 返回的 IEnumUnknown 接口的指針可以用于枚舉全部嵌入(embeddings)對象. 代碼的下一步, 我們遍歷全部嵌入對象,查詢每一個對象的IWebBrowser2 接口. 如果查詢成功, 我們已經獲得了幀的IWebBrowser2 接口指針.我們可以調用它的任何方法和屬性,在此例中,我們僅僅調用了每一個幀的Refresh.

忠告


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

調用 查找, 察看源碼, 以及 Internet 選項

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

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

Figure 6-23. Internet Options dialog box.

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

忠告


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

以下步驟實現 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.       在需要的時候執行Find, View Source, Internet Options 命令舉例來說,你可創建工具方法接收命令ID并調用 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;
}

 

 

 

 

 

 

 

 

 

 

 

 

分發WebBrowser 控件

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

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

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

導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产综合婷婷| 欧美一区二区三区在线观看| aa日韩免费精品视频一| 欧美日韩 国产精品| 一本色道久久综合精品竹菊| 亚洲欧美日韩综合aⅴ视频| 国产精品日韩电影| 久久久精品视频成人| 欧美激情欧美激情在线五月| 亚洲美女黄网| 国产精品美女久久久久久久| 久久aⅴ国产欧美74aaa| 亚洲黄色有码视频| 亚洲欧美激情一区| 在线成人免费观看| 欧美日韩高清在线一区| 先锋影院在线亚洲| 亚洲国产小视频在线观看| 性刺激综合网| 亚洲精品欧美专区| 国产精品视频内| 免费观看一区| 亚洲欧美日韩中文在线制服| 免费的成人av| 亚洲男人的天堂在线观看| 怡红院av一区二区三区| 欧美三级乱人伦电影| 久久久久久高潮国产精品视| 99re6这里只有精品| 久久一区二区三区av| 亚洲午夜激情网页| 亚洲成色777777女色窝| 国产精品久久久久久久久久久久久久| 久久久久久久久久久久久女国产乱 | 黄色成人免费观看| 欧美金8天国| 久久久久久久综合| 亚洲影院一区| 亚洲精品中文字| 免播放器亚洲一区| 久久成人精品无人区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 久久成人国产| 亚洲免费在线视频| 99re视频这里只有精品| 尤物视频一区二区| 国产日韩欧美不卡| 国产精品国产三级国产专区53| 免费精品99久久国产综合精品| 欧美一区二区| 亚洲中字黄色| 中文av一区特黄| 91久久在线| 亚洲国产精品女人久久久| 蜜臀久久99精品久久久画质超高清| 欧美在线www| 午夜精品久久久久久久久久久| 一本色道久久精品| 亚洲美女黄色| 亚洲精品在线三区| 亚洲人精品午夜| 亚洲人成网站影音先锋播放| 在线欧美一区| 亚洲福利国产精品| 在线观看一区| 亚洲第一页自拍| 亚洲国产精品第一区二区| 伊大人香蕉综合8在线视| 激情国产一区二区| **欧美日韩vr在线| 亚洲大胆女人| 亚洲日本成人女熟在线观看| 亚洲区在线播放| 日韩视频第一页| 一本色道久久| 亚洲一卡二卡三卡四卡五卡| 一区二区毛片| 亚洲一区二区三区影院| 亚洲欧美中文日韩v在线观看| 午夜精品国产| 欧美一区亚洲二区| 久久影院午夜论| 欧美大片在线观看一区二区| 亚洲第一中文字幕在线观看| 亚洲老司机av| 亚洲一区在线免费| 久久精品人人做人人综合| 久久久久久一区| 欧美精品一卡二卡| 另类亚洲自拍| 亚洲激情精品| 亚洲一区二区精品在线观看| 亚洲男女自偷自拍图片另类| 久久国产天堂福利天堂| 麻豆91精品91久久久的内涵| 欧美日韩第一区| 国产精品一区二区在线| 国内精品久久久| 亚洲六月丁香色婷婷综合久久| 在线一区亚洲| 久久久久久91香蕉国产| 欧美国产在线观看| 99精品国产福利在线观看免费 | 亚洲一区二区欧美| 欧美一区三区三区高中清蜜桃 | 亚洲私人影吧| 久久久久久尹人网香蕉| 亚洲国产美女精品久久久久∴| 99精品欧美一区二区三区| 欧美一级久久久| 欧美极品在线视频| 国产性天天综合网| 一本色道久久综合亚洲二区三区| 欧美亚洲免费在线| 亚洲国产成人91精品| 亚洲欧美经典视频| 欧美激情无毛| 黑人操亚洲美女惩罚| 在线视频欧美精品| 免费观看成人www动漫视频| 99热这里只有成人精品国产| 久久久久在线观看| 国产精品亚洲综合天堂夜夜 | 日韩视频二区| 久久久97精品| 国产精自产拍久久久久久蜜 | 这里只有精品电影| 久久这里有精品15一区二区三区| 亚洲精品一区二区三区蜜桃久| 久久精品91久久久久久再现| 欧美午夜电影一区| 亚洲国产一区二区三区在线播 | 国产精品国产三级国产a| 亚洲二区视频| 久久精品在线免费观看| 亚洲五月六月| 欧美日韩精品一区视频| 亚洲激情视频在线播放| 久久久久综合| 亚洲欧美久久久| 国产精品成人免费视频| 夜夜嗨一区二区三区| 欧美激情乱人伦| 久久中文精品| 一色屋精品视频在线观看网站 | 久久综合狠狠| 性欧美暴力猛交69hd| 国产精品日韩精品欧美精品| 一区二区激情| 日韩一级黄色大片| 欧美日韩高清区| 99天天综合性| 亚洲精品在线观| 欧美精品系列| 99视频有精品| 夜夜嗨av色一区二区不卡| 欧美日韩一区二区三区视频 | 校园春色国产精品| 国产日韩精品久久| 欧美影视一区| 欧美一区久久| 尤物yw午夜国产精品视频| 久久五月天婷婷| 久久夜精品va视频免费观看| 亚洲第一黄色网| 亚洲国产va精品久久久不卡综合| 麻豆成人精品| 日韩视频中午一区| 一本久久a久久精品亚洲| 欧美三区在线视频| 午夜精品久久久久久久蜜桃app | 国产欧美1区2区3区| 欧美一区二区三区精品电影| 亚洲欧美第一页| 国产一区二区三区观看| 蜜臀va亚洲va欧美va天堂 | 在线视频亚洲欧美| aa级大片欧美| 国产日韩高清一区二区三区在线| 久久免费一区| 欧美激情久久久久久| 亚洲影音先锋| 久久精品国产亚洲aⅴ| 亚洲国产精品一区二区三区| 亚洲激情成人| 国产精品一区二区你懂得| 久久露脸国产精品| 欧美成人免费网| 亚洲一级二级在线| 久久精品国产96久久久香蕉| 亚洲精品系列| 亚洲欧美日韩国产一区二区三区| 黄色日韩网站| 最新亚洲激情| 国产视频精品网| 亚洲国产成人久久| 国产欧美综合在线| 亚洲福利免费| 国产欧美一区二区色老头| 亚洲第一页在线|