zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    15.Python略有小成(内置模块Ⅰ)
    14.Python略有小成(自由模块)
    13.Python略有小成(装饰器,递归函数)
    12.Python略有小成(生成器,推导式,内置函数,闭包)
    11.Python初窥门径(函数名,可迭代对象,迭代器)
    python-正则表达式1消-?号除贪婪模式
    python-虚拟环境的搭建-学习20190529
    mysql 创建用户远程连接
    关于Apache php 报500错误
    嗅探主机的网络包并解析成ip地址
  • 原文地址:https://www.cnblogs.com/aishangxue/p/3397781.html
Copyright © 2011-2022 走看看