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 相关文章推荐
EXT中xtype的含义分析
Jan 07 Javascript
使用jquery为table动态添加行的实现代码
Mar 30 Javascript
JavaScript实现简单的时钟实例代码
Nov 23 Javascript
js数组的基本操作(很全自己整理的)
Oct 16 Javascript
jquery实现表单验证简单实例演示
Nov 23 Javascript
老生常谈JavaScript 正则表达式语法
Aug 20 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
Nov 15 Javascript
vue实现密码显示隐藏切换功能
Feb 23 Javascript
自定义Vue中的v-module双向绑定的实现
Apr 17 Javascript
javascript实现遮罩层动态效果实例
May 14 Javascript
JS实现点击掉落特效
Jan 29 Javascript
前端JavaScript大管家 package.json
Nov 02 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
基于PHP5魔术常量与魔术方法的详解
2013/06/13 PHP
PHP数据库万能引擎类adodb配置使用以及实例集锦
2014/06/12 PHP
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
Exjs 入门篇
2010/04/07 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
2018/10/12 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
React实现todolist功能
2020/12/28 Javascript
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
Python base64编码解码实例
2015/06/21 Python
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
浅析Git版本控制器使用
2017/12/10 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
经济管理专业自荐信
2013/12/30 职场文书
企业内部培训方案
2014/02/04 职场文书
财务会计专业自荐书
2014/06/30 职场文书
个人整改方案范文
2014/10/25 职场文书
2016年3月份红领巾广播稿
2015/12/21 职场文书
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python