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 相关文章推荐
CSS+JS构建的图片查看器
Jul 22 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
Sep 08 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
Feb 13 Javascript
Jquery之Bind方法参数传递与接收的三种方法
Jun 24 Javascript
node.js中的fs.lstat方法使用说明
Dec 16 Javascript
JavaScript中的toLocaleDateString()方法使用简介
Jun 12 Javascript
基于JavaScript实现树形下拉框
Aug 10 Javascript
如何编写jquery插件
Mar 29 jQuery
JavaScript的继承实现小结
May 07 Javascript
轻量级JS Cookie插件js-cookie的使用方法
Mar 22 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
javascript实现放大镜功能
Dec 09 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框架功能对照表
2014/10/23 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
JavaScript 学习笔记(十一)
2010/01/19 Javascript
ASP.NET jQuery 实例6 (实现CheckBoxList成员全选或全取消)
2012/01/13 Javascript
js Dialog 实践分享
2012/10/22 Javascript
你的 mixin 真的兼容 ECMAScript 5 吗?
2013/04/11 Javascript
JS HTML5 音乐天气播放器(Ajax获取天气信息)
2013/05/26 Javascript
Javascript中各种trim的实现详细解析
2013/12/10 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
URL中“#” “?” &amp;“”号的作用浅析
2017/02/04 Javascript
jQuery实现链接的title快速出现的方法
2017/02/20 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
小程序登录/注册页面设计的实现代码
2019/05/24 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
python每次处理固定个数的字符的方法总结
2013/01/29 Python
在Django中限制已登录用户的访问的方法
2015/07/23 Python
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
python 对给定可迭代集合统计出现频率,并排序的方法
2018/10/18 Python
python 解压pkl文件的方法
2018/10/25 Python
简单了解为什么python函数后有多个括号
2019/12/19 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
安踏官方商城:anta.cn
2019/12/16 全球购物
英语专业自荐书
2014/06/13 职场文书
保洁员岗位职责
2015/02/04 职场文书
黄石寨导游词
2015/02/05 职场文书
岗位职责范本大全
2015/02/26 职场文书
清洁工工作总结
2015/08/11 职场文书
初中数学教学反思范文
2016/02/17 职场文书
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
2021/06/04 Oracle