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


Posted in Javascript onAugust 09, 2016

第一种:通过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"

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

Javascript 相关文章推荐
JavaScript游戏之优化篇
Nov 08 Javascript
使用jquery实现仿百度自动补全特效
Jul 23 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
Oct 13 Javascript
jQuery之简单的表单验证实例
Jul 07 Javascript
Bootstrap Search Suggest使用例子
Dec 21 Javascript
BootStrap CSS全局样式和表格样式源码解析
Jan 20 Javascript
jQuery中DOM节点的删除方法总结(超全面)
Jan 22 Javascript
js实现股票实时刷新数据案例
May 14 Javascript
JavaScript中Hoisting详解 (变量提升与函数声明提升)
Aug 18 Javascript
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
Jul 26 Javascript
vue组件中的样式属性scoped实例详解
Oct 30 Javascript
nuxt配置通过指定IP和端口访问的实现
Jan 08 Javascript
HTML页面,测试JS对C函数的调用简单实例
Aug 09 #Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
Aug 09 #Javascript
jQuery实现点击查看大图并以弹框的形式居中
Aug 08 #Javascript
jQuery实现鼠标经过像翻页和描点链接效果
Aug 08 #Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
Aug 08 #Javascript
jQuery操作cookie
Aug 08 #Javascript
轮播图组件js代码
Aug 08 #Javascript
You might like
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
Win下如何安装PHP的APC拓展
2013/08/07 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
PHP 序列化和反序列化函数实例详解
2020/07/18 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
使用Math.floor与Math.random取随机整数的方法详解
2013/05/07 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
详解JavaScript树结构
2017/01/09 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
python进程类subprocess的一些操作方法例子
2014/11/22 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
Python连接Redis的基本配置方法
2018/09/13 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
Pycharm无法打开双击没反应的问题及解决方案
2020/08/17 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
一份报关员的职业规划范文
2014/01/08 职场文书
审计主管岗位职责
2014/01/31 职场文书
质量承诺书怎么写
2014/05/24 职场文书
网络营销策划方案
2014/06/04 职场文书
五年级小学生评语
2014/12/26 职场文书
音乐之声观后感
2015/06/04 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书