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 相关文章推荐
javascript之对系统的toFixed()方法的修正
May 08 Javascript
JS 动态加载脚本的4种方法
May 05 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
Mar 19 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
Jquery实现简单的轮播效果(代码管用)
Mar 14 Javascript
jquery获取复选框checkbox的值的简单实现方法
May 26 Javascript
JavaScript实现垂直向上无缝滚动特效代码
Nov 23 Javascript
Javascript 链式作用域详细介绍
Feb 23 Javascript
node.js平台下的mysql数据库配置及连接
Mar 31 Javascript
vue中echarts3.0自适应的方法
Feb 26 Javascript
jQuery实现的上拉刷新功能组件示例
May 01 jQuery
Vue通过懒加载提升页面响应速度
May 10 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集成FCK的函数代码
2008/09/27 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
详解php用static方法的原因
2018/09/12 PHP
php输出控制函数和输出函数生成静态页面
2019/06/27 PHP
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
Javascript实现获取窗口的大小和位置代码分享
2014/12/04 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
避免jQuery名字冲突 noConflict()方法
2016/07/30 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
Python使用PyGreSQL操作PostgreSQL数据库教程
2014/07/30 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
Python实现批量更换指定目录下文件扩展名的方法
2016/09/19 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
毕业生机械建模求职信
2013/10/14 职场文书
小学新教师培训方案
2014/02/03 职场文书
实践单位评语
2014/04/26 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
银行服务明星推荐材料
2014/05/29 职场文书
学校欢迎标语
2014/06/18 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
党员干部对十八届四中全会的期盼
2014/10/17 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
先进单位事迹材料
2014/12/25 职场文书
大学生实习推荐信
2015/03/27 职场文书
毕业班工作总结
2015/08/10 职场文书
Python如何配置环境变量详解
2021/05/18 Python
Ajax实现异步加载数据
2021/11/17 Javascript
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB