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 相关文章推荐
关于jquery动态增减控件的一些想法和小插件
Aug 01 Javascript
jquery div 居中技巧应用介绍
Nov 24 Javascript
学习js在线html(富文本,所见即所得)编辑器
Dec 18 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
Jan 07 Javascript
jQuery实现数字加减效果汇总
Dec 16 Javascript
有关jQuery中parent()和siblings()的小问题
Jun 01 Javascript
Angular+Node生成随机数的方法
Jun 16 Javascript
用js屏蔽被http劫持的浮动广告实现方法
Aug 10 Javascript
值得收藏的vuejs安装教程
Nov 21 Javascript
JavaScript生成指定范围随机数和随机序列的方法
May 05 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
Sep 21 Javascript
详解微信小程序之scroll-view的flex布局问题
Jan 16 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实现的策略模式简单示例
2017/08/25 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
js预载入和JavaScript Image()对象使用介绍
2011/08/28 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
jQuery基于ajax实现带动画效果无刷新柱状图投票代码
2015/08/10 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
2016/03/09 Javascript
js仿微博动态栏功能
2017/02/22 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
vue 引入公共css文件的简单方法(推荐)
2018/01/20 Javascript
微信小程序中进行地图导航功能的实现方法
2018/06/29 Javascript
vue 修改 data 数据问题并实时显示的方法
2018/08/27 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
详解Python编程中基本的数学计算使用
2016/02/04 Python
python实现ID3决策树算法
2017/12/20 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
pytorch 求网络模型参数实例
2019/12/30 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
北京麒麟网信息技术有限公司网络游戏测试面试题
2013/09/28 面试题
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
企业管理专业个人求职信范文
2013/09/24 职场文书
质检员的岗位职责
2013/11/15 职场文书
社区党员先进事迹
2014/01/22 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
OpenCV全景图像拼接的实现示例
2021/06/05 Python