• 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;
    }
  • 相关阅读:
    深入AXI4总线- [一]握手机制
    《数字集成电路静态时序分析基础》笔记⑩
    搭建自己的gitlab
    idea连接github问题
    itguang
    [转]springboot+idea热部署(自动刷新)
    25匹马,5条赛道,一匹马一个赛道,求决胜1,2,3名至少多少场
    [转]PostgreSQL主从流复制部署
    [转]centos7 安装jdk11 并设置默认java版本
    [转]centos7 修改yum源为阿里源
  • 原文地址:https://www.cnblogs.com/dlbrant/p/1391467.html
Copyright © 2020-2023  润新知