本文介绍了VC调用JavaScript的几种方法,包括通过execScript调用、使用GetIDsOfNames查找脚本函数名称以及通过IScriptControl获取当前文档上下文并调用raw_Eval运算。
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查找脚本函数的名称,随后进行调用。这种方法可以返回结果,但无法调用JavaScript的系统函数,例如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中对该页面进行JavaScript调用并获取结果。有时,调用的JavaScript函数在页面中并不存在。通常可以使用eval(一些JavaScript语句)的形式来调用页面中不存在的函数,但上述两种方法均不支持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"。
以上这篇VC调用javascript的几种方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。