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-世界上误解最深的语言分析
Aug 12 Javascript
JavaScript 对话框和状态栏使用说明
Oct 25 Javascript
可以将word转成html的js代码
Apr 11 Javascript
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
Sep 28 Javascript
js对象内部访问this修饰的成员函数示例
Apr 27 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
Nov 20 Javascript
基于jQuery实现仿淘宝套餐选择插件
Mar 04 Javascript
JavaScript清空数组元素的两种方法简单比较
Jul 10 Javascript
vue-mugen-scroll组件实现pc端滚动刷新
Aug 16 Javascript
javascript实现获取中文汉字拼音首字母
May 19 Javascript
js 数组当前行添加数据方法详解
Jul 28 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
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
php获取301跳转URL简单实例
2013/12/16 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
实现laravel 插入操作日志到数据库的方法
2019/10/11 PHP
PHP 图片合成、仿微信群头像的方法示例
2019/10/25 PHP
用javascript获取textarea中的光标位置
2008/05/06 Javascript
jQuery 定时局部刷新(setInterval)
2010/11/19 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
vue 怎么创建组件及组件使用方法
2017/07/27 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
Vue 列表上下过渡效果的实例代码
2019/06/25 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
使用Python设置tmpfs来加速项目的教程
2015/04/17 Python
python 循环while和for in简单实例
2016/08/16 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
Keras 在fit_generator训练方式中加入图像random_crop操作
2020/07/03 Python
美的官方商城:Midea
2016/09/14 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
西安当代医院管理研究院笔试题
2015/12/11 面试题
英语专业毕业生自我鉴定
2013/11/09 职场文书
销售工作岗位职责
2013/12/24 职场文书
20年同学聚会感言
2014/02/03 职场文书
道德模范先进事迹
2014/02/14 职场文书
企业法人代表证明书
2014/09/27 职场文书
街道党工委党的群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
单位租房协议书样本
2014/10/30 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server