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 相关文章推荐
js文字滚动停顿效果代码
Jun 28 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
Apr 14 Javascript
javascript innerText和innerHtml应用
Jan 28 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
Oct 23 Javascript
javascript函数定义的几种区别小结
Jan 06 Javascript
javascript学习笔记(五)原型和原型链详解
Oct 08 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
Oct 01 Javascript
原生JS封装animate运动框架的实例
Oct 12 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
Feb 10 Javascript
使用jquery Ajax实现上传附件功能
Oct 23 jQuery
layui button 按钮弹出提示窗口,确定才进行的方法
Sep 06 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 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
最省空间的计数器
2006/10/09 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
ThinkPHP分页实例
2014/10/15 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
2019/12/11 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
javascript删除元素节点removeChild()用法实例
2015/05/26 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
详解如何使用webpack打包JS
2018/06/21 Javascript
关于node-bindings无法在Electron中使用的解决办法
2018/12/18 Javascript
JS中min函数实例讲解
2019/02/18 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
[22:59]VGJ.S vs VG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python随机生成指定长度密码的方法
2015/04/04 Python
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python实现的从右到左字符串替换方法示例
2018/07/06 Python
python之mock模块基本使用方法详解
2019/06/27 Python
python多线程使用方法实例详解
2019/12/30 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
函数指针的定义是什么
2016/08/14 面试题
培训主管的岗位职责
2013/11/23 职场文书
建筑公司员工自我鉴定
2014/04/08 职场文书
司法建议书范文
2014/05/13 职场文书
继续教育个人总结
2015/03/03 职场文书
出纳试用期自我评价
2015/03/10 职场文书
2015年收银工作总结范文
2015/04/01 职场文书
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python