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实现的水平和垂直居中的div窗口
Aug 08 Javascript
JavaScript中的原型和继承详解(图文)
Jul 18 Javascript
jQuery中replaceWith()方法用法实例
Dec 25 Javascript
JS取得绝对路径的实现代码
Jan 16 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
May 17 Javascript
jQuery实现select模糊查询(反射机制)
Jan 14 Javascript
JavaScript订单操作小程序完整版
Jun 23 Javascript
浅谈vue引入css,less遇到的坑和解决方法
Jan 20 Javascript
微信小程序实现两边小中间大的轮播效果的示例代码
Dec 07 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
Jul 27 Javascript
vue中的循环对象属性和属性值用法
Sep 04 Javascript
Vue Element UI自定义描述列表组件
May 18 Vue.js
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文件操作实现代码分享
2011/09/01 PHP
PHP使用NuSOAP调用Web服务的方法
2015/07/18 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
jQuery DOM操作小结与实例
2010/01/07 Javascript
jQuery实现列表的全选功能
2015/03/18 Javascript
dul无法加载bootstrap实现unload table/user恢复
2016/09/29 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
Vue.js实现分页查询功能
2020/11/15 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
详解vue2.0 资源文件assets和static的区别
2018/11/27 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
Python实现CET查分的方法
2015/03/10 Python
NetworkX之Prim算法(实例讲解)
2017/12/22 Python
关于python之字典的嵌套,递归调用方法
2019/01/21 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
Python turtle库的画笔控制说明
2020/06/28 Python
如何通过python计算圆周率PI
2020/11/11 Python
Python基于Faker假数据构造库
2020/11/30 Python
Etam艾格英国官网:法国著名女装品牌
2019/04/15 全球购物
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
幼儿园优秀教师事迹
2014/02/13 职场文书
部门年终奖分配方案
2014/05/07 职场文书
员工安全承诺书
2014/05/22 职场文书
金融专业毕业生自荐信
2014/06/26 职场文书
2015年八一建军节慰问信
2015/03/23 职场文书
2016年教师新年寄语
2015/08/18 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
全国劳模先进事迹材料(2016精选版)
2016/02/25 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
一文搞懂php的垃圾回收机制
2021/06/18 PHP
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers