天天看點

擷取IWebBrowser2指針的方法(二)

版權聲明

請尊重原創作品。轉載請保持文章完整性,并以超連結形式注明原始作者“tingsking18”和主站點位址,友善其他朋友提問和指正。

 在Internet Explorer程式設計中,擷取WebBrowser指針通常是一件很重要的事情,因為有了WebBrowser指針,我們就有了對IE完整的控制權。我們就可以對IE浏覽器為所欲為了,想幹什麼都可以。比方說擷取或者設定DOM控件的值。調用頁面中的JavaScript,或者控制浏覽器的行為 比方說重新整理,前進、後退等等等等。。

 下面兩篇文章中,我将介紹兩種方法來擷取IWebBrowser2指針。

第一種

使用OLEACC.dll動态庫中的ObjectFromLresult函數來擷取。

參見:擷取IWebBrowser2指針的方法(一)

第二種

使用IShellWindows 擷取目前浏覽器個數,然後周遊擷取浏覽器對象和IWebBrowser指針。

下面介紹第二種方法:

這種方法是通過建立ShellWindows執行個體,得到浏覽器對象執行個體的個數,通過周遊浏覽器對象,獲得IWebBrowser指針。

在構造SHDocVw::IWebBrowser2Ptr spBrowser對象的适合,構造不成功 就會傳回NULL,這樣的化調用QueryInterface來擷取IWebBrowser2指針是擷取不到的。所有有了if(spBrowser!=NULL)這樣一個判斷。

IWebBrowser2* GetWB()

{

SHDocVw::IShellWindowsPtr m_spSHWinds;

CComPtr<IDispatch> spDispatch;

CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> pDoc2;

CComPtr<IHTMLElement> pElement;

CComPtr<IHTMLElementCollection> pElementCol;

CComPtr<IHTMLFormElement> pFormElement;

CComPtr<IHTMLInputTextElement> pInputElement;

IWebBrowser2 * pWebBrowser = NULL;

//建立ShellWindows執行個體

if (m_spSHWinds == NULL)

{

if (m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)

{

MessageBox("Failed");

CoUninitialize();

return NULL;

}

}

if (m_spSHWinds)

{

// 取得浏覽器執行個體個數

int n = m_spSHWinds->GetCount();

for (int i = 0; i < n; i++)

{

_variant_t v = (long)i;

IDispatchPtr spDisp = m_spSHWinds->Item(v);

SHDocVw::IWebBrowser2Ptr spBrowser(spDisp); //生成一個IE視窗的智能指針

//SHDocVw::IWebBrowser2Ptr與IWebBrowser2是不一樣的

//SHDocVw::IWebBrowser2Ptr是經過COM封裝的,是以在此判斷一下

//否則QueryInterface 會出錯的。

if (spBrowser!=NULL)

{

HRESULT hr = spDisp.QueryInterface(IID_IWebBrowser2, &pWebBrowser);

if (SUCCEEDED(hr))

{

if (pWebBrowser !=NULL)

{

return pWebBrowser;

}

}

}

}

}

return NULL;

}

繼續閱讀