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 this关键字使用分析
Oct 21 Javascript
自己做的模拟模态对话框实现代码
May 23 Javascript
node.js中的fs.fchmod方法使用说明
Dec 16 Javascript
浅谈javascript中基本包装类型
Jun 03 Javascript
基于jQuery实现表格的查看修改删除
Aug 01 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
Dec 13 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
Apr 17 Javascript
Vue.js单向绑定和双向绑定实例分析
Aug 14 Javascript
解决vue-cli项目打包出现空白页和路径错误的问题
Sep 04 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
Feb 19 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
DedeCMS dede_channeltype表字段注释
2010/04/07 PHP
php笔记之:AOP的应用
2013/04/24 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
PHP PDO数据库操作预处理与注意事项
2019/03/16 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
JavaScript效率调优经验
2009/06/04 Javascript
date.parse在IE和FF中的区别
2010/07/29 Javascript
Jquery倒数计时按钮setTimeout的实例代码
2013/07/04 Javascript
JavaScript两种跨域技术全面介绍
2014/04/16 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
jQuery中text() val()和html()的区别实例详解
2016/06/28 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
bootstrap表单示例代码分享
2017/05/18 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
一些可能会用到的Node.js面试题
2019/06/15 Javascript
python判断给定的字符串是否是有效日期的方法
2015/05/13 Python
Python网络编程中urllib2模块的用法总结
2016/07/12 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
python re正则匹配网页中图片url地址的方法
2018/12/20 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
Python %r和%s区别代码实例解析
2020/04/03 Python
5款实用的python 工具推荐
2020/10/13 Python
英文自荐信
2013/12/15 职场文书
幼儿园教研活动方案
2014/01/19 职场文书
教师党员承诺书
2014/03/25 职场文书
入党转正介绍人意见
2015/06/03 职场文书
大学同学聚会感言
2015/07/30 职场文书
致毕业季:你如何做好自己的职业生涯规划书?
2019/07/01 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
python中出现invalid syntax报错的几种原因分析
2022/02/12 Python
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers