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求对象的高宽问题分别说明
Aug 30 Javascript
javascript利用apply和arguments复用方法
Nov 25 Javascript
5种处理js跨域问题方法汇总
Dec 04 Javascript
node.js中的console.timeEnd方法使用说明
Dec 09 Javascript
JavaScript中继承用法实例分析
May 16 Javascript
JS阻止事件冒泡行为和闭包的方法
Jun 16 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
Dec 25 Javascript
jquery实现提示语淡入效果
May 05 jQuery
Easyui在treegrid添加控件的实现方法
Jun 23 Javascript
详解js删除数组中的指定元素
Oct 31 Javascript
javascript全局自定义鼠标右键菜单
Dec 08 Javascript
使用js获取身份证年龄的示例代码
Dec 11 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简单静态页生成过程
2008/03/27 PHP
PHP 错误之引号中使用变量
2009/05/04 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
PHP通过get方法获得form表单数据方法总结
2018/09/12 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
用js解决数字不能换行问题
2010/08/10 Javascript
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
JavaScript使用pop方法移除数组最后一个元素用法实例
2015/04/06 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
详解JavaScript正则表达式之RegExp对象
2015/12/13 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
python+django快速实现文件上传
2016/10/24 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
python使用scapy模块实现ping扫描的过程详解
2021/01/21 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
新奇的小玩意:IWOOT
2016/07/21 全球购物
ALEX AND ANI:手镯,项链,耳环和更多
2017/04/20 全球购物
管道维修工岗位职责
2013/12/27 职场文书
村委会贫困证明
2014/01/14 职场文书
渔夫的故事教学反思
2014/02/14 职场文书
英语教学课后反思
2016/02/15 职场文书
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫