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

本文共 1940 字,大约阅读时间需要 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"

转载地址:http://mcbxl.baihongyu.com/

你可能感兴趣的文章
022# Adempiere的会计功能模组(三)
查看>>
Android自动测试工具MonkeyRunner之一:基础知识
查看>>
magic框架完成爬取文字数据
查看>>
JAVA学习日记2——foreach的常用用法
查看>>
OpenSSL 创建私有CA及客户端请求证书
查看>>
Linux 之 shell 比较运算符
查看>>
window 7 下 将asp.net core程序部署在docker 上运行
查看>>
Linux下的高级文件权限ACL
查看>>
Linux下semop等待信号时出现Interrupted System Call错误(EINTR)
查看>>
SpringCloud(第 031 篇)配置客户端ConfigClient链接经过对称加解密的配置微服务
查看>>
一道 Python 类的笔试题详解
查看>>
sysctl优化linux网络
查看>>
如何压缩 Outlook PST 和 OST 文件
查看>>
UIScrollView中的UITableView接收不到点击事件
查看>>
(12)Struts2中的Action
查看>>
基于jeasyframe框架进行开发项目实例
查看>>
WebRobot v1.5.3
查看>>
jquery构造函数分析
查看>>
手机输入法初始界面整理
查看>>
c/c++ 中的文件路径表示
查看>>