VC调用JavaScript的几种方法
本文介绍了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的几种方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
