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学习笔记一 之 数据类型
Dec 15 Javascript
纯js分页代码(简洁实用)
Nov 05 Javascript
给html超链接设置事件不使用href来完成跳
Apr 20 Javascript
在Node.js应用中使用Redis的方法简介
Jun 24 Javascript
详解JS正则replace的使用方法
Mar 06 Javascript
JavaScript动态添加事件之事件委托
Jul 12 Javascript
如何处理JSON中的特殊字符
Nov 30 Javascript
Javascript 制作图形验证码实例详解
Dec 22 Javascript
javascript正则表达式模糊匹配IP地址功能示例
Jan 06 Javascript
基于EasyUI的基础之上实现树形功能菜单
Jun 28 Javascript
使用 jQuery 实现表单验证功能
Jul 05 jQuery
解决LayUI数据表格复选框不居中显示的问题
Sep 25 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 获取select下拉列表框的值
2010/05/08 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
2013/07/02 PHP
php中的动态调用实例分析
2015/01/07 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
php中的异常和错误浅析
2017/05/03 PHP
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
Javascript中string转date示例代码
2013/11/01 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
JS浅拷贝和深拷贝原理与实现方法分析
2019/02/28 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
2018/11/29 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
python安装pil库方法及代码
2019/06/25 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
pygame实现五子棋游戏
2019/10/29 Python
Keras搭建自编码器操作
2020/07/03 Python
python一些性能分析的技巧
2020/08/30 Python
基于python+selenium自动健康打卡的实现代码
2021/01/13 Python
应届大专毕业生个人自荐信
2013/09/22 职场文书
技能比赛获奖感言
2014/02/14 职场文书
家长通知书家长评语
2014/04/17 职场文书
2014年店长工作总结
2014/11/17 职场文书
毕业论文致谢范文
2015/05/14 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
php将xml转化对象的实例详解
2021/11/17 PHP