VC调用javascript

简介:
第一种:通过execScript调用。这种方法,虽然操作方便,但不能获取返回值。
m_spHtmlDoc->get_parentWindow(&m_pHtmlWindow);
VARIANT ret;
ret.vt = VT_EMPTY;
BSTR bstr = sScript.AllocSysString();
bRet = m_pHtmlWindow->execScript(bstr, L"javascript", &ret);
::SysFreeString(bstr);
sRet = CString(ret);

第二种:先用GetIDsOfNames找到这个脚本函数名称,然后再调用。这种方法可以返回结果,有返回值。但是无法调用js的系统函数,如eval。
BOOL CDhtmlDlgWindow::CallJScript(const CString strFunc, const CStringArray& paramArray, CComVariant* pVarResult)
{
    CComPtr spScript;
    if (NULL==m_spHtmlDoc)
    {
        return FALSE;
    }
    HRESULT hr;
    hr = m_spHtmlDoc->get_Script(&spScript);
    if(!SUCCEEDED(hr))
    {
        return FALSE;
    }
    CComBSTR bstrMember(strFunc);
    DISPID dispid = NULL;
    hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,
                                            LOCALE_SYSTEM_DEFAULT,&dispid);
    if(FAILED(hr))
    {
        return FALSE;
    }

    const int arraySize = paramArray.GetSize();

    DISPPARAMS dispparams;
    memset(&dispparams, 0, sizeof dispparams);
    dispparams.cArgs = arraySize;
    dispparams.rgvarg = new VARIANT[dispparams.cArgs];
    
    for( int i = 0; i < arraySize; i++)
    {
        CComBSTR bstr = paramArray.GetAt(arraySize - 1 - i); // back reading
        bstr.CopyTo(&dispparams.rgvarg[i].bstrVal);
        dispparams.rgvarg[i].vt = VT_BSTR;
    }
    dispparams.cNamedArgs = 0;

    EXCEPINFO excepInfo;
    memset(&excepInfo, 0, sizeof excepInfo);
       CComVariant vaResult;
    UINT nArgErr = (UINT)-1;  // initialize to invalid arg
    
    hr = spScript->Invoke(dispid,IID_NULL,0,
                            DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);

    delete [] dispparams.rgvarg;
    if(FAILED(hr))
    {
        return FALSE;
    }
    
    *pVarResult = vaResult;
    return TRUE;
}

实际使用时,可能是先访问(Navigate)了一个页面。然后,在VC里面对这个页面进行一些js调用,并取回结果。有可能这个js调用的函数是这个页面里面没有的。一般可以用eval(一些js语句)这样的形式来调用页面里面没有的函数,但是,现在上面两种方法都不支持eval。

第三种:通过IScriptControl获取当前文档上下文,然后调用IScriptControl::raw_Eval运算。(只能用raw_Eval,用Eval方法会提示没有权限。)
首先定义一个:IScriptControlPtr,然后在OnDocumentComplete里面调用一下 m_spHtmlDoc->get_parentWindow(&m_pHtmlWindow);
IScriptControlPtr->AddObject("window", m_pHtmlWindow, VARIANT_TRUE);

第三种需要import "msscript.ocx"

本文转自博客园知识天地的博客,原文链接:VC调用javascript,如需转载请自行联系原博主。


相关文章
|
JavaScript 前端开发 Android开发
JS(Javascript)调用Android原生方法三步走
JS(Javascript)调用Android原生方法三步走
597 0
|
JavaScript 前端开发 API
js调用网页摄像头进行直播/拍照
js调用网页摄像头进行直播/拍照
447 0
js调用网页摄像头进行直播/拍照
|
JavaScript Android开发 iOS开发
html通过js调用ios或android代码
html通过js调用ios或android代码
70 0
|
移动开发 JavaScript weex
weex开发 - 方法的映射,在weex调用fetch方法,实际调用同名的原生方法,在回调中把数据传递回js
weex开发 - 方法的映射,在weex调用fetch方法,实际调用同名的原生方法,在回调中把数据传递回js
210 0
|
JavaScript 前端开发 Java
java调用js实现富文本过滤
java调用js实现富文本过滤
275 0
java调用js实现富文本过滤
|
JavaScript
js循环调用接口
js循环调用接口
329 0
|
JavaScript 前端开发
JavaScript 进阶第六章(this与函数的调用模式 )
JavaScript 进阶第六章(this与函数的调用模式 )
93 0
|
Web App开发 前端开发 JavaScript
Javascript 的工作原理:引擎、运行时和调用堆栈概述
随着 Javascript 越来越流行,使其应用的场景越来越多,不仅限于前端,可以是后端、混合应用程序、嵌入式设备等等,于是就有了大前端的叫法。本文开始带大家一起回顾总结 Javascript 的构建块以及它们是如何协同工作,理解其原理,将有助于编写更优的代码。
209 0
Javascript 的工作原理:引擎、运行时和调用堆栈概述
|
JavaScript 前端开发 Java
JS 调用栈机制与 ES6 尾调用优化介绍
调用栈的英文名叫做Call Stack,大家或多或少是有听过的,但是对于js调用栈的工作方式以及如何在工作中利用这一特性,大部分人可能没有进行过更深入的研究,这块内容可以说对我们前端来说就是所谓的基础知识,咋一看好像用处并没有很大,但掌握好这个知识点,就可以让我们在以后可以走的更远,走的更快! 目录 数据结构:栈 调用栈是什么?用来做什么? 调用栈的运行机制 调用栈优化内存 调用栈debug大法 数据结构:栈 栈是一种遵从后进先出(LIFO)原则的有序集合,新元素都靠近栈顶,旧元素都接近栈底。 生活中的栗子,帮助一下理解:
221 0
JS 调用栈机制与 ES6 尾调用优化介绍
|
JavaScript
vue2:mixin(混入)(公共js调用;模块化)
vue2:mixin(混入)(公共js调用;模块化)
348 0