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 相关文章推荐
编辑浪子版表单验证类
May 12 Javascript
点击标签切换和自动切换DIV选项卡
Aug 10 Javascript
原生js实现tab选项卡切换
Mar 23 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
Oct 27 Javascript
angularjs实现下拉列表的选中事件示例
Mar 03 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
Apr 23 jQuery
Vue+Element使用富文本编辑器的示例代码
Aug 14 Javascript
jQuery第一次运行页面默认触发点击事件的实例
Jan 10 jQuery
解决vue多个路由共用一个页面的问题
Mar 12 Javascript
小程序如何支持使用 async/await详解
Sep 12 Javascript
JavaScript设计模式之原型模式详情
Jun 21 Javascript
vue实现简易音乐播放器
Aug 14 Vue.js
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生成便于打印的网页
2006/10/09 PHP
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
Smarty安装配置方法
2008/04/10 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
php将时间差转换为字符串提示
2011/09/07 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
php ImageMagick windows下安装教程
2015/01/26 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
js 模拟实现类似c#下的hashtable的简单功能代码
2010/01/24 Javascript
JS实现在Repeater控件中创建可隐藏区域的代码
2010/09/16 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
Javascript在IE和Firefox浏览器常见兼容性问题总结
2016/08/03 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
jQuery插件FusionCharts实现的Marimekko图效果示例【附demo源码】
2017/03/24 jQuery
JS实现异步上传压缩图片
2017/04/22 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
Python跳出循环语句continue与break的区别
2014/08/25 Python
python实现分析apache和nginx日志文件并输出访客ip列表的方法
2015/04/04 Python
Python isinstance函数介绍
2015/04/14 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
Python字符串hashlib加密模块使用案例
2020/03/10 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
生产经理的自我评价分享
2013/11/07 职场文书
医学专业本科毕业生自我鉴定
2013/12/28 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
Python日志模块logging用法
2022/06/05 Python