在WebBrowser中C++可以和JS互相通信,下面说一下怎样实现C++调用JS。
- 所有的网页全局函数均是window的一个方法,所以首先获取到页面的window对象。
- 将所调用的JS方法名转换为ID,IDispatch对象的GetIDsOfNames方法。
- 通过函数ID调用JS函数,IDispatch对象的Invoke方法。
一下是DuiLib中的WebBrowser具体实现:
1)继承CWebBrowserUI创建一个新类。
这里说下这个函数
1 IDispatch* DuiLib::CWebBrowserUI::GetHtmlWindow() 2 { 3 IDispatch* pDp = NULL; 4 HRESULT hr; 5 if (m_pWebBrowser2) 6 hr=m_pWebBrowser2->get_Document(&pDp); 7 8 if (FAILED(hr)) 9 return NULL; 10 11 CComQIPtr<IHTMLDocument2> pHtmlDoc2 = pDp; 12 13 if (pHtmlDoc2 == NULL) 14 return NULL; 15 16 hr=pHtmlDoc2->get_parentWindow(&_pHtmlWnd2); 17 18 if (FAILED(hr)) 19 return NULL; 20 21 IDispatch *pHtmlWindown = NULL; 22 hr=_pHtmlWnd2->QueryInterface(IID_IDispatch, (void**)&pHtmlWindown); 23 if (FAILED(hr)) 24 return NULL; 25 26 return pHtmlWindown; 27 }这个函数就是实现第一步所说的,不过DuiLib库已经实现了。下面两部的函数第一个参数值就是这个函数的返回值。
2)添加一个函数FindId
1 DISPID CWebBrowserExUI::FindId( IDispatch *pObj, LPOLESTR pName ) 2 { 3 DISPID id = 0; 4 if(FAILED(pObj->GetIDsOfNames(IID_NULL,&pName,1,LOCALE_SYSTEM_DEFAULT,&id))) id = -1; 5 return id; 6 }3)添加我们的目标函数,调用JS的主要函数:
1 HRESULT CWebBrowserExUI::InvokeHtmlMethod( IDispatch *pObj, LPOLESTR pName, VARIANT *pVarResult, VARIANT *p, int cArgs ) 2 { 3 DISPID dispid = FindId(pObj, pName); 4 if(dispid == -1) return E_FAIL; 5 6 DISPPARAMS ps; 7 ps.cArgs = cArgs; 8 ps.rgvarg = p; 9 ps.cNamedArgs = 0; 10 ps.rgdispidNamedArgs = NULL; 11 12 return pObj->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &ps, pVarResult, NULL, NULL); 13 }
参考文章:http://www.cnblogs.com/lucc/archive/2010/11/24/1886087.html