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 自定义带默认值的函数
Jul 21 Javascript
简述JavaScript对传统文档对象模型的支持
Jun 16 Javascript
JavaScript使用DeviceOne开发实战(三)仿微信应用
Dec 02 Javascript
基于javascript html5实现多文件上传
Mar 03 Javascript
jQuery插件制作的实例教程
May 16 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
May 19 Javascript
微信小程序-拍照或选择图片并上传文件
Jan 06 Javascript
video.js使用改变ui过程
Mar 05 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
vue2.0使用swiper组件实现轮播效果
Nov 27 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
Jul 24 Javascript
深入理解移动前端开发之viewport
Oct 19 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入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
解析js中获得父窗口链接getParent方法以及各种打开窗口的方法
2013/06/19 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
使用控制台破解百小度一个月只准改一次名字
2015/08/13 Javascript
全面解析Bootstrap表单使用方法(表单控件)
2015/11/24 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
canvas时钟效果
2017/02/16 Javascript
jQuery使用jsonp实现百度搜索的示例代码
2020/07/08 jQuery
复习Python中的字符串知识点
2015/04/14 Python
Python实现提取文章摘要的方法
2015/04/21 Python
Python读写zip压缩文件的方法
2018/08/29 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
销售行业个人求职自荐信
2013/09/25 职场文书
农林环境专业求职信
2014/03/13 职场文书
企业承诺书格式
2014/05/21 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
代办社保委托书范文
2014/10/06 职场文书
师德承诺书
2015/01/20 职场文书
2015年员工工作表现评语
2015/03/25 职场文书
2015年青年志愿者协会工作总结
2015/04/27 职场文书
高中班主任寄语
2019/06/21 职场文书
Python深度学习之Pytorch初步使用
2021/05/20 Python