版權聲明
請尊重原創作品。轉載請保持文章完整性,并以超連結形式注明原始作者“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;
}