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对JSON进行模式匹配(Part 1-设计)
Jul 17 Javascript
JS获取浏览器版本及名称实现函数
Apr 02 Javascript
js获得地址栏?问号后参数的方法
Aug 08 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 Javascript
如何实现textarea里的不同文本显示不同颜色
Jan 20 Javascript
js中哈希表的几种用法总结
Jan 28 Javascript
JS实现很酷的EMAIL地址添加功能实例
Feb 28 Javascript
vue.js+boostrap项目实践(案例详解)
Sep 21 Javascript
BootstrapValidator超详细教程(推荐)
Dec 07 Javascript
详解vue-router2.0动态路由获取参数
Jun 14 Javascript
vue组件实现进度条效果
Jun 06 Javascript
webpack3升级到webpack4遇到问题总结
Sep 30 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+mysql 实现身份验证代码
2010/03/24 PHP
基于php伪静态的实现详细介绍
2013/04/28 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
2019/10/09 PHP
win10下 php安装seaslog扩展的详细步骤
2020/12/04 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
Javascript 面向对象(一)(共有方法,私有方法,特权方法)
2012/05/23 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
JavaScript File分段上传
2016/03/10 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
详解vue-cli与webpack结合如何处理静态资源
2017/09/19 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
2018/12/03 Javascript
vue 实现element-ui中的加载中状态
2020/11/11 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
Python群发邮件实例代码
2014/01/03 Python
跟老齐学Python之for循环语句
2014/10/02 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
师范大学音乐表演专业求职信
2013/10/23 职场文书
社区工作者思想汇报
2014/01/13 职场文书
追讨欠款律师函
2015/05/27 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
Vue组件更新数据v-model不生效的解决
2022/04/02 Vue.js
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript