WebBrowser之C++调用JS函数

在WebBrowser中C++可以和JS互相通信,下面说一下怎样实现C++调用JS。

  1. 所有的网页全局函数均是window的一个方法,所以首先获取到页面的window对象。 
  2. 将所调用的JS方法名转换为ID,IDispatch对象的GetIDsOfNames方法。
  3. 通过函数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

posted @ 2013-10-30 21:24  ssp1024  阅读(2896)  评论(0编辑  收藏  举报