COM组件中调用JavaScript函数详解及实例


Posted in Javascript onFebruary 23, 2017

COM组件中调用JavaScript函数详解及实例

要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度。这就要求使用回调函数,设其名称为scriptCallbackFunc。实现这个技术很简单:

1 、组件方(C++)

组件A 的方法在IDL中定义:

[id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional] VARIANT scriptCallback);

组件A的方法实现:

// 假设回调原型为:  
// scriptCallbackFunc(LONG nCurrentProgress, LONG nTotalProgress, BSTR bstrProgressName); 
// 此方法由JS脚本来实现 
STDMETHODIMP CA:: longCalc (DOUBLE v1, DOUBLE v2, VARIANT scriptCallback) 
{ 
  CComPtr<IDispatch> spCallback; 
  if (scriptCallback.vt == VT_DISPATCH) 
     spCallback = scriptCallback.pdispVal; 
   
 
  // 参数准备 
  CComVariant varResult; 
  CComVariant avarParams[3]; 
  avarParams[0] = “开始计算股票”;    // bstrProgressName 
  avarParams[0].vt = VT_BSTR; 
  avarParams[1] = 100;               // nTotalProgress 
  avarParams[1].vt = VT_I4; 
  avarParams[2] = 0;                 // nCurrentProgress 
  avarParams[2].vt = VT_I4; 
  DISPPARAMS params = { avarParams, NULL, 3, 0 }; 
 
 
  if(spCallback) 
     spCallback->Invoke(0,  
        IID_NULL,  
        LOCALE_USER_DEFAULT,  
        DISPATCH_METHOD,  
        ¶ms, &varResult, NULL, NULL); 
 
  BOOL bFinished = false; 
   
 
  while(!bFinished) 
  { 
     // 计算工作… 
     Sleep(1000); 
     v1 = v1+v2; 
  
    // 回调客户 
    if(spCallback) 
    { 
      avarParams[0] = “正在计算股票…”; 
      avarParams[2] = 0; 
      spCallback->Invoke(0,  
             IID_NULL,  
             LOCALE_USER_DEFAULT,  
             DISPATCH_METHOD,  
             ¶ms, &varResult, NULL, NULL); 
     } 
 
     if(…) 
         bFinished = TRUE; 
   } // while OK! 
 
   return S_OK; 
}

2、 客户方(JS)

<script language="javascript"> 
<!-- 
   // 符合回调原型:scriptCallbackFunc 
   function scfDisplayProgress(nCurrentProgress, nTotalProgress, bstrProgressName) 
   { 
       window.status = bstrProgressName + “:”+(nCurrentProgress *100/TotalProgress); 
   } 
  
   // 创建组件并执行longCalc 
   var objA = new ActiveXObject(“MyCom.A”); 
 
    // 使用回调: 执行时在IE状态栏显示进度 
    objA. longCalc (100, 200, scfDisplayProgress);  
 
    // 不使用回调 
    objA. longCalc (100, 200);  
//--> 
</script>

3 说明

  • 该技术仅适用于脚本。不适合于VB、C++客户。
  • 该技术和连接点、事件无关。
  • 微软的XML DOM对象广泛使用这个方法。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
Apr 24 Javascript
IE6不能修改NAME问题的解决方法
Sep 03 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
May 02 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
Jan 17 Javascript
javascript列表框操作函数集合汇总
Nov 28 Javascript
网站内容禁止复制和粘贴、另存为的js代码
Feb 26 Javascript
javascript异步编程代码书写规范Promise学习笔记
Feb 11 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
Sep 08 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
Aug 20 Javascript
jquery实现二级导航下拉菜单效果实例
May 14 jQuery
JavaScript原型继承和原型链原理详解
Feb 04 Javascript
6种JavaScript继承方式及优缺点(小结)
Feb 06 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
Feb 23 #Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 #Javascript
JS实现的五级联动菜单效果完整实例
Feb 23 #Javascript
jquery实现焦点轮播效果
Feb 23 #Javascript
SVG描边动画
Feb 23 #Javascript
Angular JS 生成动态二维码的方法
Feb 23 #Javascript
js实现楼层导航功能
Feb 23 #Javascript
You might like
php mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
PHP生成压缩文件实例
2015/02/07 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
javascript FormatNumber函数实现方法
2008/12/30 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
2013/07/03 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
jQuery实现折叠、展开的菜单组效果代码
2015/09/16 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
Angular2 环境配置详细介绍
2016/09/21 Javascript
JavaScript中Array对象用法实例总结
2016/11/29 Javascript
Javascript 实现放大镜效果实例详解
2016/12/03 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
jQuery插件FusionCharts绘制的3D饼状图效果实例【附demo源码下载】
2017/03/03 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
javascript实现图片轮换动作方法
2020/08/07 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
基于python plotly交互式图表大全
2019/12/07 Python
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
西部世纪.net笔试题面试题
2014/04/03 面试题
护士自我鉴定范文
2013/10/06 职场文书
新学期校长寄语
2014/01/18 职场文书
面试后的英文感谢信
2014/02/01 职场文书
销售员岗位职责范本
2014/02/03 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
客户付款通知书
2015/04/23 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript