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 相关文章推荐
新浪的图片新闻效果
Jan 13 Javascript
使用JS操作页面表格,元素的一些技巧
Feb 02 Javascript
js弹窗代码 可以指定弹出间隔
Jul 03 Javascript
php对mongodb的扩展(初识如故)
Nov 11 Javascript
浅析JQuery中的html(),text(),val()区别
Sep 01 Javascript
JavaScript中的原型链prototype介绍
Dec 30 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
Oct 05 Javascript
webpack常用配置项配置文件介绍
Nov 07 Javascript
10道典型的JavaScript面试题
Mar 22 Javascript
JS随机排序数组实现方法分析
Oct 11 Javascript
微信小程序的线程架构【推荐】
May 14 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
Oct 12 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
浅谈php处理后端&amp;接口访问超时的解决方法
2016/10/29 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
jQuery的一些注意
2006/12/06 Javascript
jQuery 使用手册(一)
2009/09/23 Javascript
从数组中随机取x条不重复数据的JS代码
2013/12/24 Javascript
JavaScript SHA512&amp;SHA256加密算法详解
2015/08/11 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
AngularJS指令与控制器之间的交互功能示例
2016/12/14 Javascript
超全面的vue.js使用总结
2017/02/12 Javascript
vue中如何实现变量和字符串拼接
2017/06/19 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
webpack写jquery插件的环境配置
2017/12/21 jQuery
详解Vue单元测试Karma+Mocha学习笔记
2018/01/31 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
node事件循环和process模块实例分析
2020/02/14 Javascript
pymongo实现多结果进行多列排序的方法
2015/05/16 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
python利用opencv实现颜色检测
2021/02/23 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
广州某公司软件工程师面试题
2014/12/22 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
大学生职业生涯设计书
2014/01/02 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB