• 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

  • 相关阅读:
    值类型引用类型的区别(转)
    聚集索引和非聚集索引(转)
    使用docker安装nginx并配置端口转发
    jenkins选择分支构建
    创建好docker后不能apt-get update解决方法
    Docker开启Remote API 访问 2375端口
    Docker加速配置
    Docker下载安装
    进入Docker 容器 docker exec [CONTAINER ID] bin/bash报错问题
    定时删除日志文件---linux定时清理日志
  • 原文地址:https://www.cnblogs.com/aishangxue/p/3397781.html
Copyright © 2020-2023  润新知