VC调用JavaScript的几种方法

作者:小括号时间:2026-10-30 11:53:05浏览:122

本文介绍了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的几种方法(推荐)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

作者最新文章