原帖网址:http://blog.csdn.net/tingsking18/article/details/4620144
版权声明
请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。
在Internet Explorer编程中,获取WebBrowser指针通常是一件很重要的事情,因为有了WebBrowser指针,我们就有了对IE完整的控制权。我们就可以对IE浏览器为所欲为了,想干什么都可以。比方说获取或者设置DOM控件的值。调用页面中的JavaScript,或者控制浏览器的行为 比方说刷新,前进、后退等等等等。。
下面两篇文章中,我将介绍两种方法来获取IWebBrowser2指针。
第一种
使用OLEACC.dll动态库中的ObjectFromLresult函数来获取。
第二种
使用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;
- }