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 相关文章推荐
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
Sep 26 Javascript
jquery实现网站超链接和图片提示效果
Mar 21 Javascript
javascript对中文按照拼音排序代码
Aug 20 Javascript
javascript自动生成包含数字与字符的随机字符串
Feb 09 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
Jul 17 Javascript
JavaScript对象数组的排序处理方法
Oct 21 Javascript
ES6新特性六:promise对象实例详解
Apr 21 Javascript
angular2 ng build部署后base文件路径问题详细解答
Jul 15 Javascript
详解如何使用webpack在vue项目中写jsx语法
Nov 08 Javascript
js实现中文实时时钟
Jan 15 Javascript
Javascript ParentNode和ChildNode接口原理解析
Mar 16 Javascript
JavaScript常用进制转换及位运算实例解析
Oct 14 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实现简单数字分页效果
2015/07/26 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
jQuery示例收集
2010/11/05 Javascript
JavaScript调用ajax获取文本文件内容实现代码
2014/03/28 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
js实现文本框选中的方法
2015/05/26 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
Vue.js实现数据响应的方法
2018/08/13 Javascript
postman自定义函数实现 时间函数的思路详解
2019/04/17 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
Python遍历目录的4种方法实例介绍
2015/04/13 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
Python Gluon参数和模块命名操作教程
2019/12/18 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
Python数据可视化图实现过程详解
2020/06/12 Python
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
EJB3推出JPA的原因
2013/10/16 面试题
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
毕业生求职的求职信
2013/12/05 职场文书
公司司机岗位职责
2014/02/07 职场文书
模范教师事迹材料
2014/02/10 职场文书
热爱祖国演讲稿
2014/05/04 职场文书
交心谈心活动总结
2015/05/11 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
六年级作文之关于梦
2019/10/22 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP