VC調用JS

bool CGetWebApp::SetDocument(IDispatch* pDisp)
{
    CHECK_POINTER(pDisp);

    m_spHtmlDoc = NULL;

    CComPtr<IDispatch> spScript = pDisp;

    HRESULT hr = spScript->QueryInterface(IID_IHTMLDocument2,(void**)&m_spHtmlDoc);
    if(FAILED(hr))
    {
        return false;
    }
    return true;
}   

bool CGetWebApp::GetJScript(CComPtr<IDispatch>& spScript)
{
    CHECK_POINTER(m_spHtmlDoc);
    HRESULT hr = m_spHtmlDoc->get_Script(&spScript);
    ATLASSERT(SUCCEEDED(hr));
    return SUCCEEDED(hr);
}

bool CGetWebApp::CallJScript(const CString strFunc, const CStringArray& paramArray, CComVariant* pVarResult)
{
    CComPtr<IDispatch> spScript;
    if (!GetJScript(spScript))
    {
        return FALSE;
    }
    CComBSTR bstrMember(strFunc);
    DISPID dispid = NULL;
    HRESULT hr = spScript->GetIDsOfNames(IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);
    if(FAILED(hr))
    {
        return FALSE;
    }
    const int INT_PTR = paramArray.GetSize();
    DISPPARAMS dispparams;
    memset(&dispparams, 0, sizeof dispparams);
    dispparams.cArgs = INT_PTR;
    dispparams.rgvarg = new VARIANT[dispparams.cArgs];
    for( int i = 0; i < INT_PTR; i++)
    {
        CComBSTR bstr = paramArray.GetAt(INT_PTR - 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);  //調用js函數

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章