VC调用javascript的几种方法(推荐)

前端之家收集整理的这篇文章主要介绍了VC调用javascript的几种方法(推荐)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

第一种:

通过execScript调用。这种方法,虽然操作方便,但不能获取返回值。

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。

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,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,sizeof excepInfo);
CComVariant vaResult;
UINT nArgErr = (UINT)-1; // initialize to invalid arg

hr = spScript->Invoke(dispid,IID_NULL,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"

以上这篇VC调用javascript的几种方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程之家。

猜你在找的JavaScript相关文章