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 相关文章推荐
基于jQuery的实现简单的分页控件
Oct 10 Javascript
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
javascript创建对象的几种模式介绍
May 06 Javascript
javascript滚轮事件基础实例讲解(37)
Feb 14 Javascript
微信小程序后台解密用户数据实例详解
Jun 28 Javascript
jQuery列表检索功能实现代码
Jul 17 jQuery
vue做网页开场视频的实例代码
Oct 20 Javascript
React.js组件实现拖拽排序组件功能过程解析
Apr 27 Javascript
详解Vue之计算属性
Jun 20 Javascript
Vue使用预渲染代替SSR的方法
Jul 02 Javascript
js 数组当前行添加数据方法详解
Jul 28 Javascript
React更新渲染原理深入分析
Dec 24 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
Zend Framework实现多文件上传功能实例
2016/03/21 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
php7下的filesize函数
2019/09/30 PHP
学习js所必须要知道的一些
2007/03/07 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
20行JS代码实现网页刮刮乐效果
2017/06/23 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
浅谈如何通过node.js对数据进行MD5加密
2018/05/16 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
2018/07/09 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
2020/02/25 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
会计学财务管理专业个人的自我评价
2013/10/19 职场文书
演讲稿开场白
2014/01/13 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
银行柜员求职自荐书
2014/06/18 职场文书
上海世博会口号
2014/06/19 职场文书
好的促销活动方案
2014/08/21 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
医院财务人员岗位职责
2015/04/14 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
2015年除四害工作总结
2015/07/23 职场文书
2019最新企业员工考勤管理制度(通用版)!
2019/07/02 职场文书
导游词之介休绵山
2019/12/31 职场文书