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 相关文章推荐
Prototype使用指南之array.js
Jan 10 Javascript
基于jquery实现的省市区级联无ajax
Sep 24 Javascript
js特殊字符转义介绍
Nov 05 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
Feb 28 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
Mar 20 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 Javascript
Vue中render函数的使用方法
Jan 31 Javascript
jquery.picsign图片标注组件实例详解
Feb 02 jQuery
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
Sep 17 Javascript
vue 强制组件重新渲染(重置)的两种方案
Oct 29 Javascript
vue中用 async/await 来处理异步操作
Jul 18 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
Dec 10 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
使用Sphinx对索引进行搜索
2013/06/25 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
11款新鲜的jQuery插件[附所有demo下载]
2011/01/24 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
简单的jquery左侧导航栏和页面选中效果
2014/08/21 Javascript
自定义百度分享的分享按钮
2015/03/18 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
使用Ajax生成的Excel文件并下载的实例
2016/11/21 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
2018/12/12 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
layer.open 获取不到表单信息的解决方法
2019/09/26 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
[59:08]Ti4 冒泡赛第二天 NEWBEE vs Titan 2
2014/07/15 DOTA
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
使用Python进行QQ批量登录的实例代码
2018/06/11 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
openCV提取图像中的矩形区域
2020/07/21 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
应聘医药代表职位求职信
2013/10/21 职场文书
管理心得体会
2013/12/28 职场文书
运动会广播稿200米
2014/01/27 职场文书
跳蚤市场口号
2014/06/13 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
2014年协会工作总结
2014/11/22 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python