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"
相關文章
相關標籤/搜索