MFC Active控件回调web页面中的js函数

//初始化操作

void Init()

{

    try 

    { 

        LPOLECLIENTSITE pClientSite = GetClientSite(); 

        if(pClientSite == NULL

        {

            return

        }

        IServiceProvider *isp = NULL

        //COM对象指针获取一般利用QueryInterface函数

        HRESULT hr = pClientSite->QueryInterface(IID_IServiceProvider

            reinterpret_cast<void**>(&isp)); 

        if (FAILED(hr))

        {

            return

        }

        IServiceProvider *isp2 = NULL

        hr = isp->QueryService(SID_STopLevelBrowser,

            IID_IServiceProvider,

            reinterpret_cast<void**>(&isp2));

        isp->Release(); 

        if (FAILED(hr))

        {

            return

        }

        IWebBrowser2browser = NULL

        hr = isp2->QueryService(SID_SWebBrowserApp

            IID_IWebBrowser2

            reinterpret_cast<void**>(&browser)); 

        isp2->Release(); 

        if (FAILED(hr))

        {

            return;

        }

        IHTMLDocumentdoc = NULL

        hr=browser->get_Document((IDispatch**)&doc); 

        browser->Release(); 

        if(FAILED(hr))

        {

            return

        }

        hr=doc->get_Script(&m_script);

        doc->Release(); 

        if(FAILED(hr)) 

        { 

            m_script = NULL

            return

        } 

    } 

    catch(...)

    { 

    }

}

//回调js函数

void Test()

{

    CComPtr<IDispatchg_script = NULL;     //g_scrip为全局函数, 需要在调用之前获取

    //这里得到js函数dispid

    CComBSTR bstrMember("js_fun_nane"); 

    DISPID dispid = 0; 

    HRESULT hr = g_script->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);

    if(FAILED(hr)) 

    { 

        return

    } 

    DISPPARAMS  dispparams

    memset(&dispparams, 0, sizeof dispparams); 

    dispparams.cArgs = 4; 

    dispparams.rgvarg = new VARIANT[dispparams.cArgs]; 

    //回调函数有四个参数

    for(int i=0;   i < 3;   i++)

    {

        dispparams.rgvarg[i].vt = VT_I4;

    }

    dispparams.rgvarg[0].lVal = 1; 

    dispparams.rgvarg[1].lVal = 2; 

    dispparams.rgvarg[2].lVal = 3; 

    dispparams.rgvarg[3].vt = VT_BSTR

    dispparams.rgvarg[3].bstrVal   =   CString(_T("hello world")).AllocSysString(); 

    //dispparams.cNamedArgs   =   0; 

    EXCEPINFO   excepInfo

    memset(&excepInfo, 0, sizeof excepInfo); 

    //_variant_t   Var; 

    //Var.Clear(); 

    CComVariant varesult

    UINT nArgErr =   (UINT)-1; 

    //调用页面方法

    g_script->Invoke(dispid

                     IID_NULL

                     0, 

                     DISPATCH_METHOD

                     &dispparams,

                     &varesult

                     &excepInfo

                     &nArgErr);

    delete   []dispparams.rgvarg;

    //判断返回值

    if (FAILED(hr)) 

    { 

        //失败

        return "-1";

    } 

    else 

    { 

        CString Result

        if   (varesult.vt != VT_EMPTY

        { 

            Result = varesult.bstrVal

        } 

        else 

        { 

            Result = "1"

        } 

        return   Result

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值