第一種:經過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"