博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VC调用javascript
阅读量:6714 次
发布时间:2019-06-25

本文共 1973 字,大约阅读时间需要 6 分钟。

第一种:通过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"

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

你可能感兴趣的文章
用 Anaconda 完美解决 Python2 和 python3 共存问题
查看>>
易语言飞扬学习
查看>>
Android 自定义Android ORM 框架greenDAO数据库文件的路径
查看>>
python程序打包成.exe
查看>>
oc懒加载 & swift lazy
查看>>
CUDA 编程的基本模式
查看>>
git命令行解决冲突文件步骤
查看>>
List、Map、Set三个接口,存取元素时,各有什么特点?
查看>>
js进阶 12-6 监听鼠标滚动事件和窗口改变事件怎么写
查看>>
HttpClient的基本使用
查看>>
Tomcat 7服务器线程模型
查看>>
idea设置断点,对于for循环,到指定次数时停止
查看>>
lua中面向对象(class)实现探索(一)(转)
查看>>
Model元数据定制与Model模板
查看>>
JS异常简单处理
查看>>
jvisualvm 工具使用
查看>>
《精通Python设计模式》学习行为型之责任链模式
查看>>
How to Limit NodeRunner.exe High Memory, CPU Usage
查看>>
solr7.1.0学习笔记(10)---Solr发布到Tomcat
查看>>
洛谷P1435 回文字串(dp)
查看>>