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中的Split使用方法与技巧
Mar 09 Javascript
$()JS小技巧
Jul 21 Javascript
document.getElementById为空或不是对象的解决方法
Jan 24 Javascript
JQuery表格内容过滤的实现方法
Jul 05 Javascript
JQuery给元素绑定click事件多次执行的解决方法
May 29 Javascript
JsRender for index循环索引用法详解
Oct 31 Javascript
JavaScript静态类型检查工具FLOW简介
Jan 06 Javascript
原生JS实现网络彩票投注效果
Sep 25 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
Dec 19 Javascript
Vue 拦截器对token过期处理方法
Jan 23 Javascript
javascript代码优化的8点总结
Jan 29 Javascript
微信小程序实现购物页面左右联动
Feb 15 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 文件上传模型,支持多文件上传
2009/08/13 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
JavaScript实现大图轮播效果
2017/01/11 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
vue $router和$route的区别详解
2020/12/02 Vue.js
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
详解Python中的各种函数的使用
2015/05/24 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
介绍一下Java的安全机制
2012/06/28 面试题
资产评估专业大学生求职信
2013/09/29 职场文书
销售会计工作职责
2013/12/02 职场文书
演讲稿开场白
2014/01/13 职场文书
工作决心书范文
2014/03/11 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
幼儿园八一建军节活动方案
2014/08/27 职场文书
大学军训的体会
2014/11/08 职场文书
起诉意见书范文
2015/05/19 职场文书
25句企业管理语录:助你迅速打开思路,句句经典!
2020/01/14 职场文书
zabbix agent2 监控oracle数据库的方法
2021/05/13 Oracle
深入理解 Golang 的字符串
2022/05/04 Golang