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中鼠标滚轮事件
May 26 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
May 25 Javascript
JS区分Object与Aarry的六种方法总结
Feb 27 Javascript
jQuery倒计时代码(超简单)
Feb 27 Javascript
jQuery操作css样式
May 15 jQuery
JavaScrip数组删除特定元素的几种方法总结
Sep 06 Javascript
vue组件学习教程
Sep 09 Javascript
vue-cli3 从搭建到优化的详细步骤
Jan 20 Javascript
javascript中floor使用方法总结
Feb 02 Javascript
通过原生vue添加滚动加载更多功能
Nov 21 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
Jun 17 Javascript
前端开发基础javaScript的六大作用
Aug 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作的文本留言本的例子(三)
2006/10/09 PHP
php表单提交与$_POST实例分析
2015/01/26 PHP
PHP代码优化技巧小结
2015/09/29 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
jQuery动画animate方法使用介绍
2013/05/06 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
2013/09/29 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
JavaScript中使用自然对数ln的方法
2015/06/14 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
JS实现倒计时图文效果
2018/11/17 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
vue 在methods中调用mounted的实现操作
2020/08/07 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
详解supervisor使用教程
2017/11/21 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
Pytorch 计算误判率,计算准确率,计算召回率的例子
2020/01/18 Python
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
英智兴达软件测试笔试题
2016/10/12 面试题
国贸专业个人求职信分享
2013/12/04 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
面试自我介绍演讲稿
2014/04/29 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
行政司机岗位职责
2015/04/10 职场文书
投标单位介绍信
2015/05/05 职场文书
幼儿园毕业典礼园长致辞
2015/07/29 职场文书
追悼会家属答谢词
2015/09/29 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
担保书怎么写 ?
2019/04/22 职场文书
MySQL索引篇之千万级数据实战测试
2021/04/05 MySQL
原生JS实现飞机大战小游戏
2021/06/09 Javascript