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

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            如何對webbrowser和IE編程(六)

            使用VC++和COM API

            盡管使用VC不像Vb中那么容易自動化IE,但是也不太難,尤其是你理解了CON和COM API。無論你使用MFC, ATL, 或者標(biāo)準(zhǔn) C++自動化IE,方法都是一樣—你使用COM API來實(shí)現(xiàn).

            VC++中創(chuàng)建一個Internet Explorer實(shí)例包括要調(diào)用COM API CoCreateInstance ,指定第一個參數(shù)為 CLSID_InternetExplorer 。創(chuàng)建IE自動化實(shí)例不像創(chuàng)建包含webbrowser的Activex控件困難。你不需要實(shí)現(xiàn)容器或者site對象的必要接口。

            來看看如何容易的使用CoCreateInstance 創(chuàng)建IE實(shí)例吧。啟動Visual C++, 新建MFC AppWizard (exe) 應(yīng)用程序命名為 MfcAutoIE.選擇dialog-based option, 認(rèn)可其他缺省選項(xiàng).

            現(xiàn)在加入如VbAutoIE中的控件到表單.對話框看起來如 6-21. 分派ID到對話框的各個控件。 確信控件TAB次序如 Figure 6-22. (tab 次序影響到radio按鈕的工作)

            Figure 6-21. MfcAutoIE dialog.

            Figure 6-22. MfcAutoIE dialog tab order.

            現(xiàn)在用右鍵菜單設(shè)置每一個隱藏radio按鈕的Group ,屬性設(shè)置如表 6-9.

            Table 6-9. Member Variables for MfcAutoIE Dialog Controls

            Control

            Type

            Member Variable

            Hide radio button for AddressBar

            int

            m_nAddressBar

            Edit box

            CString

            m_strStatusText

            Hide radio button for MenuBar

            int

            m_nMenuBar

            Hide radio button for StatusBar

            int

            m_nStatusBar

            Hide radio button for ToolBar

            int

            m_nToolBar

            我們使用ClassWizard 為表 6-9 中的控件建立變量時,他們自動加入到 CMfcAutoIEDlg. 成員變量設(shè)置為-1.

            編譯 MfcAutoIE Example 之前我們設(shè)置編譯的 Directory 次序 屬性

            編譯之前,你需要處理一些重要任務(wù):

            1. ??? 確信你已經(jīng)從MSDN中下載IE5的頭文件和庫文件。

            2. Tools/Options 菜單的 Directories , 確信 lib 路徑中包含 Internet Explorer 5 Windows 2000 庫文件 . 載列表中。

            3. 配置 Include

            ?

            現(xiàn)在我們加入代碼使之工作。 首先你應(yīng)當(dāng)包含ExDisp.h到你的對話框頭文件—MfcAutoIEDlg.h. ExDisp.h 是包含了WebBrowser接口和類ID的頭文件.確信你已經(jīng)從MSDN下載了最新的版本。

            建立一個private 或者protected 的數(shù)據(jù)類型,指向IWebBrowser2 ?的指針, ?命名為 m_pInetExplorer. 如下

            												
            														protected:
            												
            										
            												
            														
            																
            																		?? IWebBrowser2* m_pInetExplorer;
            														
            												
            										

            現(xiàn)在在構(gòu)造函數(shù)中初始化m_pInetExplorerNULL 。你必須也初始化COM. 放置一個CoInitialize 的COM API調(diào)用在構(gòu)造函數(shù)。構(gòu)造函數(shù)看起來應(yīng)當(dāng)如下:

            												
            														CMfcAutoIEDlg::CMfcAutoIEDlg(CWnd* pParent /*=NULL*/)
            												
            										
            												
            														
            																
            																		?? : CDialog(CMfcAutoIEDlg::IDD, pParent),
            														
            												
            										
            												
            														
            																
            																		???? m_pInetExplorer(NULL)
            														
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? //{{AFX_DATA_INIT(CMfcAutoIEDlg)
            														
            												
            										
            												
            														
            																
            																		?? m_strStatusText = _T("");
            														
            												
            										
            												
            														
            																
            																		?? m_nAddressBar = -1;
            														
            												
            										
            												
            														
            																
            																		?? m_nMenuBar = -1;
            														
            												
            										
            												
            														
            																
            																		?? m_nStatusBar = -1;
            														
            												
            										
            												
            														
            																
            																		?? m_nToolBar = -1;
            														
            												
            										
            												
            														
            																
            																		?? //}}AFX_DATA_INIT
            														
            												
            										
            												
            														
            																
            																		?? //Note that LoadIcon does not require a subsequent DestroyIcon
            														
            												
            										
            												
            														
            																
            																		?? //in Win32.
            														
            												
            										
            												
            														
            																
            																		?? m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? // Initialize COM
            														
            												
            										
            												
            														
            																
            																		?? CoInitialize(NULL);
            														
            												
            										
            												
            														}
            												
            										

            建立一個析構(gòu)函數(shù),以便調(diào)用CoUninitialize API 函數(shù)用以反初始化 COM. 此處的析構(gòu)函數(shù):

            												
            														CMfcAutoIEDlg::~CMfcAutoIEDlg()
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? // Uninitialize COM.
            														
            												
            										
            												
            														
            																
            																		?? //
            														
            												
            										
            												
            														
            																
            																		?? CoUninitialize();
            														
            												
            										
            												
            														}
            												
            										

            在預(yù)備工作之后, 讓我們開始實(shí)現(xiàn)具體的控制。首先為Start IE5 按鈕建立一個消息循環(huán). 通常,你可以使用ClassWizard建立消息循環(huán)處理句柄. 在此消息句柄, 采用 CoCreateInstance API 建立一個IE實(shí)例。 此處初建的Internet Explorer實(shí)例初始化為隱藏, 所以你必須使用Visible屬性使他可見。為了導(dǎo)航到用戶的主頁,使用GoHome 方法。此處為消息處理句柄代碼:

            												
            														void CMfcAutoIEDlg::OnStartIE5() 
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? // If an instance of Internet Explorer has
            														
            												
            										
            												
            														
            																
            																		?? // not already been created, create one.
            														
            												
            										
            												
            														
            																
            																		?? // This instance will initially be hidden,
            														
            												
            										
            												
            														
            																
            																		?? // so make it visible by using the Visible
            														
            												
            										
            												
            														
            																
            																		?? // property. Also, navigate to the user's
            														
            												
            										
            												
            														
            																
            																		?? // home page by using the GoHome method.
            														
            												
            										
            												
            														
            																
            																		?? //
            														
            												
            										
            												
            														
            																
            																		?? if (m_pInetExplorer)
            														
            												
            										
            												
            														
            																
            																		????? MessageBox
            														
            												
            										
            												
            														
            																
            																		???????? (_T("Only one instance of Internet Explorer is allowed."));
            														
            												
            										
            												
            														
            																
            																		?? else
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? HRESULT hr;
            														
            												
            										
            												
            														
            																
            																		????? hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER,
            														
            												
            										
            												
            														
            																
            																		?????????????????????????? IID_IWebBrowser2, (LPVOID*)&m_pInetExplorer);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		????? if (SUCCEEDED(hr))
            														
            												
            										
            												
            														
            																
            																		????? {
            														
            												
            										
            												
            														
            																
            																		???????? // Set the radio buttons to their correct values.
            														
            												
            										
            												
            														
            																
            																		???????? SetRadioButtons();
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		???????? m_pInetExplorer->put_Visible(VARIANT_TRUE);
            														
            												
            										
            												
            														
            																
            																		???????? m_pInetExplorer->GoHome();
            														
            												
            										
            												
            														
            																
            																		????? }
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														}
            												
            										

            在此代碼中,我們首先檢查是否IE的上一個實(shí)例已經(jīng)建立。如果已經(jīng)建立,將會顯示一個錯誤消息框。(你僅僅能夠啟動一個IE的實(shí)例,隨后你將可以看到如何檢測IE窗口被關(guān)閉以便重置IE的數(shù)據(jù)成員。)如果一個IE的實(shí)例還未創(chuàng)建, CoCreateInstanceCLSID_InternetExplorer 作為第一個參數(shù)被調(diào)用. (此類 ID 定義于ExDisp.h ,為Internet Explorer的唯一標(biāo)示符.)

            第二個參數(shù)我們設(shè)定為NULL ,因?yàn)槲覀儾幌M薈OM對象被聚合(be aggregated). 我們希望IE運(yùn)行在一個單獨(dú)的進(jìn)程空間,所以我們指定第三個參數(shù)為特殊值 CLSCTX_SERVER .我們利用第四個參數(shù)指示哪一個接口我們將通過CoCreateInstance 調(diào)用創(chuàng)建一個COM對象后被創(chuàng)建。在此例中,我們將一直希望獲得IWebBrowser2, 所以我們指定IID_IWebBrowser2 為第四個參數(shù)值。最后我們傳送存儲接口指針的變量. 對于此參數(shù),你必須采用void類型傳遞一個指針的地址 (確信你傳送的指針指向一個接口類型。)

            如果一個IE實(shí)例成功創(chuàng)建,名為SetRadioButtons 的成員變量被創(chuàng)建。這是一個protected 成員函數(shù),檢查當(dāng)前地址欄、菜單條、工具條和狀態(tài)條等的狀態(tài) ,用來設(shè)置radio 按鈕組的狀態(tài)。.為檢查每一個的狀態(tài)我們簡單的獲取屬性關(guān)聯(lián)的當(dāng)前值 。

            C++ 應(yīng)用中使用COM 沒有包裝類, 屬性被引用為使用 get_ and put_ 方法.為檢取每一個用戶問題的狀態(tài),我們簡單的調(diào)用每一個關(guān)聯(lián)的(UI)項(xiàng)目的get_ 方法 .除了 get_ToolBar外其他get_方法返回指向VARIANT_BOOL 數(shù)據(jù)類型,返回值指示用戶接口是否可見或者隱藏。如果用戶接口元素可見,將返回VARIANT_TRUE 。如果該項(xiàng)目是隱藏的,將返回VARIANT_FALSE 。這些值區(qū)別于TRUE FALSE 的用法.

            提醒


            當(dāng)在 Visual C++ 涉及 VARIANT_BOOL , 你必須使用 VARIANT_TRUE 或者 VARIANT_FALSE 代替 TRUE or FALSE. VARIANT_TRUE 定義值 0xffff , TRUE 定義為 1 . 如果你比較 VARIANT_TRUE TRUE , 你將發(fā)現(xiàn)在 Vb 中不匹配,你可以在涉及到 VARIANT_BOOL . 使用 true false 是由于 VB 替你實(shí)現(xiàn)了轉(zhuǎn)換。

            get _ToolBar 方法不同于其他屬性,因?yàn)樗赶蛞粋€整型指針,所以我們?nèi)绻l(fā)現(xiàn)返回非0,工具條可見。如果整型值是0,工具條將隱藏:

            提醒


            如果一個屬性只讀 , put_ 將不會出現(xiàn)。同樣,如果一個屬性只寫,將不會出現(xiàn) get_ 方法。

            此處為 SetRadioButtons 方法的代碼:

            												
            														void CMfcAutoIEDlg::SetRadioButtons()
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? VARIANT_BOOL vtBool = VARIANT_TRUE;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? // Get the current state of the AddressBar.
            														
            												
            										
            												
            														
            																
            																		?? //
            														
            												
            										
            												
            														
            																
            																		?? m_pInetExplorer->get_AddressBar(&vtBool);
            														
            												
            										
            												
            														
            																
            																		?? m_nAddressBar = (vtBool == VARIANT_TRUE) ? 1 : 0;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? // Get the current state of the MenuBar.
            														
            												
            										
            												
            														
            																
            																		?? //
            														
            												
            										
            												
            														
            																
            																		?? m_pInetExplorer->get_MenuBar(&vtBool);
            														
            												
            										
            												
            														
            																
            																		?? m_nMenuBar = (vtBool == VARIANT_TRUE) ? 1 : 0;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? // Get the current state of the StatusBar.
            														
            												
            										
            												
            														
            																
            																		?? //
            														
            												
            										
            												
            														
            																
            																		?? m_pInetExplorer->get_StatusBar(&vtBool);
            														
            												
            										
            												
            														
            																
            																		?? m_nStatusBar = (vtBool == VARIANT_TRUE) ? 1 : 0;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? // Get the current state of the ToolBar.
            														
            												
            										
            												
            														
            																
            																		?? // Unlike the other get methods, get_ToolBar
            														
            												
            										
            												
            														
            																
            																		?? // takes a pointer to an integer.
            														
            												
            										
            												
            														
            																
            																		?? //
            														
            												
            										
            												
            														
            																
            																		?? m_pInetExplorer->get_ToolBar(&m_nToolBar);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? UpdateData(FALSE);? // Initializes dialog box with changed values.
            														
            												
            										
            												
            														}
            												
            										

            :

            												
            														void CMfcAutoIEDlg::OnAddrBarShowHide() 
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? UpdateData(TRUE);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (m_pInetExplorer)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? VARIANT_BOOL vtShow = 
            														
            												
            										
            												
            														
            																
            																		?????????m_nAddressBar ? VARIANT_TRUE : VARIANT_FALSE;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		????? m_pInetExplorer->put_AddressBar(vtShow);
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														}
            												
            										
            												
            														
            																?

            												
            														void CMfcAutoIEDlg::OnMenuBarShowHide() 
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? UpdateData(TRUE);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (m_pInetExplorer)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? VARIANT_BOOL vtShow = 
            														
            												
            										
            												
            														
            																
            																		?????????m_nMenuBar ? VARIANT_TRUE : VARIANT_FALSE;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		????? m_pInetExplorer->put_MenuBar(vtShow);
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														}
            												
            										
            												
            														
            																?

            												
            														void CMfcAutoIEDlg::OnStatusBarShowHide() 
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? UpdateData(TRUE);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (m_pInetExplorer)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? VARIANT_BOOL vtShow = 
            														
            												
            										
            												
            														
            																
            																		?????????m_nStatusBar ? VARIANT_TRUE : VARIANT_FALSE;
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		????? m_pInetExplorer->put_StatusBar(vtShow);
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														}
            												
            										
            												
            														
            																?

            												
            														void CMfcAutoIEDlg::OnToolBarShowHide() 
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? UpdateData(TRUE);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (m_pInetExplorer)
            														
            												
            										
            												
            														
            																
            																		????? m_pInetExplorer->put_ToolBar(m_nToolBar);
            														
            												
            										
            												
            														}
            												
            										

            注意到OnToolBarShowHide 方法中我們將m_nToolBar 數(shù)據(jù)成員傳遞給put_ToolBar 方法替代了VARIANT_BOOL. 我們暫時不解釋為什么,就像get_ToolBar, put_ToolBar 傳遞一個整型而不是 VARIANT_BOOL.

            現(xiàn)在利用ClassWizard 建立一個Change 按鈕的消息循環(huán)處理句柄 。此消息的句柄將在任何時候設(shè)定set Internet Explorer 的狀態(tài)條為edit 輸入框內(nèi)容。 代碼看起來如下:

            												
            														void CMfcAutoIEDlg::OnChangeStatusText() 
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? UpdateData(TRUE);
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? if (m_pInetExplorer)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? _bstr_t bstrStatusText = m_strStatusText.AllocSysString();
            														
            												
            										
            												
            														
            																
            																		????? m_pInetExplorer->put_StatusText(bstrStatusText);
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														}
            												
            										

            確信你在第一個任務(wù)就是調(diào)用傳遞TRUE的 UpdateData and .這樣的目的是更新對阿框中所有相關(guān)的控件, 包括 m_strStatusText. 如果m_pInetExplorer 不是NULL—那意味著 Internet Explorer一個實(shí)例已經(jīng)被創(chuàng)建— StatusText 被設(shè)定為用戶輸入的文字。 StatusText 同樣事采用put_ 設(shè)定Visible 屬性。 該函數(shù)需要一個BSTR的入口參數(shù),所以調(diào)用 AllocSysString 方法使得m_strStatusText 數(shù)據(jù)成員變量分派為BSTR 可以傳遞給put_StatusText. AllocSysStringCString 的方法,返回一個Cstring對象中值的 BSTR 類型。BSTR 返回自 AllocSysString 存儲于_bstr_t類型的變量, 一個 COM 編譯器支持的Visual C++類。為了使用此類,你必須包含comdef.h 頭文件,置于對話框?qū)崿F(xiàn)文件CMfcAutoIEDlg—MfcAutoIEDlg.cpp. 該類將小心處理BSTR 離開當(dāng)前范圍的狀況,所以你不需要調(diào)用SysFreeStringWin32 API 以釋放調(diào)用 put_StatusText.之后的BSTR.

            至此,我們基本上完成了。為了使用戶輸入Enter時不關(guān)閉對話框,重寫基類對話框的OnOK方法。在此方法中,簡單的不做任何事。確信你沒有調(diào)用基類的CDialog::OnOK 方法,否則,對話框會關(guān)閉。

            現(xiàn)在來重寫OnCancel 的基類方法, 該方法調(diào)用于用戶按下ESC或者點(diǎn)擊對話框的右鍵菜單的關(guān)閉或者對話框的X按鈕。在 OnCancel中,如果一個Internet Explorer 實(shí)例已經(jīng)被創(chuàng)建, 在調(diào)用Quit 方法時關(guān)閉InternetExplorer 對象。 Quit 甚至可以在用戶默認(rèn)關(guān)掉Internet Explorer. 如果出現(xiàn)此情形, Quit 方法將返回 RPC_S_SERVER_UNAVAILABLE, 標(biāo)示Internet Explorer 不再可用.你可以簡單忽略此錯誤消息。以下為OnCancel的代碼:

            												
            														void CMfcAutoIEDlg::OnCancel()
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? if (m_pInetExplorer)
            														
            												
            										
            												
            														
            																
            																		????? m_pInetExplorer->Quit();
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? CDialog::OnCancel();
            														
            												
            										
            												
            														}
            												
            										

            最后, 你必須釋放掉指向IE的IWebBrowser2 接口指針。你可以在對話框的析構(gòu)函數(shù)中處理。此處為更型后的析構(gòu)函數(shù):

            												
            														CMfcAutoIEDlg::~CMfcAutoIEDlg()
            												
            										
            												
            														{
            												
            										
            												
            														
            																
            																		?? // Release the WebBrowser interface pointer
            														
            												
            										
            												
            														
            																
            																		?? //
            														
            												
            										
            												
            														
            																
            																		?? if (m_pInetExplorer)
            														
            												
            										
            												
            														
            																
            																		?? {
            														
            												
            										
            												
            														
            																
            																		????? m_pInetExplorer->Release();
            														
            												
            										
            												
            														
            																
            																		????? m_pInetExplorer = NULL;
            														
            												
            										
            												
            														
            																
            																		?? }
            														
            												
            										
            												
            														
            																?

            												
            														
            																
            																		?? // Uninitialize COM
            														
            												
            										
            												
            														
            																
            																		?? //
            														
            												
            										
            												
            														
            																
            																		?? CoUninitialize();
            														
            												
            										
            												
            														}
            												
            										
            現(xiàn)在,通常我們可以編譯運(yùn)行對話框應(yīng)用程序。啟動 IE 實(shí)例,測試。

            posted on 2006-06-23 21:42 楊粼波 閱讀(1466) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            久久久久亚洲AV无码永不| 99久久精品无码一区二区毛片| 久久亚洲高清综合| 2019久久久高清456| 精品人妻久久久久久888| 国产精品VIDEOSSEX久久发布| 亚洲一区中文字幕久久| 久久久黄色大片| 99久久精品无码一区二区毛片| 怡红院日本一道日本久久 | 久久99精品国产一区二区三区 | 99久久精品国产一区二区三区| 久久精品国产色蜜蜜麻豆| 亚洲AV日韩AV永久无码久久| 久久se精品一区二区影院| 欧美噜噜久久久XXX| 日韩中文久久| 亚洲国产精品久久久久婷婷软件 | 国产69精品久久久久观看软件| 1000部精品久久久久久久久| 久久青青草视频| 国产高清美女一级a毛片久久w| 久久久噜噜噜www成人网| 尹人香蕉久久99天天拍| 精品久久久久久无码中文字幕 | jizzjizz国产精品久久| 久久精品国产亚洲AV蜜臀色欲 | 狠狠色婷婷综合天天久久丁香 | 久久国内免费视频| 精品久久久久久久中文字幕| 粉嫩小泬无遮挡久久久久久| 无码人妻久久一区二区三区免费丨 | 99久久免费国产精品热| 人妻精品久久无码专区精东影业 | 国产精品久久久天天影视香蕉| 72种姿势欧美久久久久大黄蕉| 久久99精品久久久久久动态图| 无码精品久久久天天影视| 新狼窝色AV性久久久久久| 亚洲国产精品一区二区久久hs| 日韩人妻无码一区二区三区久久|