zoukankan      html  css  js  c++  java
  • C++通过Webbrowser调用JavaScript

    // 定义 CWebBrowser2

    Code

     // 装载包含JavaScript的Html

    Code

     // 调用JavaScript

    Code

     // C++调用JavaScript

    Code

     ////////////////////////////////////////////////////////////

    // 简洁改进

    HRESULT CXXUtil::CallJsFunc(const CComPtr<IHTMLDocument2> spDocument2, 
                                        const CString &strJsFuncName, const std::list<CString> &params, CComVariant *pVarResult)
    {
        HRESULT hr = S_FALSE;
    
        if (spDocument2)
        {
            CComPtr<IDispatch> spScript = NULL;
            hr = spDocument2->get_Script(&spScript);
    
            if (SUCCEEDED(hr) && spScript)
            {
                CComBSTR bstrFunc(strJsFuncName);
                DISPID dispid = 0;
                hr = spScript->GetIDsOfNames(IID_NULL, &bstrFunc, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
    
                if(SUCCEEDED(hr))
                {
                    const size_t paramCnt = params.size();
                    DISPPARAMS dispparams = {0};
                    //memset(&dispparams, 0, sizeof dispparams);
                    dispparams.cArgs = paramCnt;
                    dispparams.cNamedArgs = 0;
                    dispparams.rgvarg = new VARIANT[dispparams.cArgs];
    
                    for(size_t i = 0; i < paramCnt; i++)
                    {
                        std::list<CString>::const_iterator cit = params.begin();
                        std::advance(cit, (paramCnt - 1 - i));// back reading
                        CComBSTR bstrParam = (*cit).GetString();
                        dispparams.rgvarg[i].vt = VT_BSTR;
                        dispparams.rgvarg[i].bstrVal = bstrParam.Detach();
                    }
    
                    EXCEPINFO excepInfo = {0};
                    //memset(&excepInfo, 0, sizeof excepInfo);
                    CComVariant vaResult;
                    UINT nArgErr = (UINT)0; //-1;  // initialize to invalid arg
    
                    hr = spScript->Invoke(dispid, IID_NULL, 0 , DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr);
    
                    // cleanup
                    for(UINT ix = 0; ix < dispparams.cArgs; ++ix)
                    {
                        ::SysFreeString(dispparams.rgvarg[ix].bstrVal);
                    }
                    delete [] dispparams.rgvarg;
    
                    if(SUCCEEDED(hr) && pVarResult)
                    {
                        *pVarResult = vaResult;
                    }
                }
            }
        }
    
        return hr;
    }
  • 相关阅读:
    (七) rest_framework GenericAPIView/GenericViewSet/ ModelViewSet 解析
    (六) rest_framework 普通分页与加密分页
    (五) rest_framework 序列化与解析器源码实现
    (四) rest_framework 版本控制源码
    【使用 PySpark 分析 CSV 文件】
    安装 HBase1.3.6 on Windows 10 64 bit
    Spark Job 性能调优 (二)
    Spark RDD 分区到底怎么用?
    安装 Spyder python 开发环境 用于 Spark 数据分析 -word count
    安装 Spark on Windows 使用 PySpark
  • 原文地址:https://www.cnblogs.com/dlbrant/p/1391467.html
Copyright © 2011-2022 走看看