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 22 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
Jan 06 Javascript
jQuery 回车事件enter使用示例
Feb 18 Javascript
每天一篇javascript学习小结(面向对象编程)
Nov 20 Javascript
基于JS实现无缝滚动思路及代码分享
Jun 07 Javascript
微信小程序 MINA文件结构
Oct 17 Javascript
Angular中的interceptors拦截器
Jun 25 Javascript
javaScript和jQuery自动加载简单代码实现方法
Nov 24 jQuery
详解JSON Web Token 入门教程
Jul 30 Javascript
webpack4.0 入门实践教程
Oct 08 Javascript
4 种滚动吸顶实现方式的比较
Apr 09 Javascript
使用 Vue cli 3.0 构建自定义组件库的方法
Apr 30 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设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
自写的利用PDO对mysql数据库增删改查操作类
2018/02/19 PHP
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
利用javascript实现web页面中指定区域打印
2013/10/30 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
Vue Element 分组+多选+可搜索Select选择器实现示例
2018/07/23 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
python计算程序开始到程序结束的运行时间和程序运行的CPU时间
2013/11/28 Python
python操作gmail实例
2015/01/14 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
python 识别图片中的文字信息方法
2018/05/10 Python
解决Python中回文数和质数的问题
2019/11/24 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
wedgwood加拿大官网:1759年成立的英国国宝级陶瓷餐具品牌
2018/07/17 全球购物
.NET现在共支持多少种语言
2014/02/26 面试题
自荐信写法介绍
2014/01/25 职场文书
教师个人鉴定材料
2014/02/08 职场文书
公司担保书格式范文
2014/05/12 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
学生违反校规检讨书
2014/10/28 职场文书
入党现实表现材料
2014/12/23 职场文书
写给老婆的保证书
2015/02/27 职场文书
学习十八大的感悟
2015/08/11 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL