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语法着色引擎(demo及打包文件下载)
Jun 13 Javascript
Prototype Number对象 学习
Jul 19 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
Aug 21 Javascript
悬浮广告方法日常收集整理
Mar 18 Javascript
JQuery Ajax WebService传递参数的简单实例
Nov 02 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
Nov 15 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
Dec 27 Javascript
vue监听键盘事件的快捷方法【推荐】
Jul 11 Javascript
vue如何实现自定义底部菜单栏
Jul 01 Javascript
JavaScript获取页面元素的常用方法详解
Sep 28 Javascript
小程序实现录音上传功能
Nov 22 Javascript
js实现鼠标拖曳效果
Dec 30 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
防止本地用户用fsockopen DDOS攻击对策
2011/11/02 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
2014/09/29 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
PHP new static 和 new self详解
2017/02/19 PHP
在PHP 7下安装Swoole与Yar,Yaf的方法教程
2017/06/02 PHP
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
Vue开发过程中遇到的疑惑知识点总结
2017/01/20 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
在Vue中如何使用Cookie操作实例
2017/07/27 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
2017/12/27 Javascript
vue内置指令详解
2018/04/03 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
python UNIX_TIMESTAMP时间处理方法分析
2016/04/18 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
曼联官方网上商店:Manchester United Direct
2017/07/28 全球购物
酒店采购员岗位职责
2014/03/14 职场文书
庆六一开幕词
2015/01/29 职场文书
学生会部长竞选稿
2015/11/19 职场文书
技术入股协议书
2016/03/22 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技
python使用torch随机初始化参数
2022/03/22 Python
讲解MySQL增删改操作
2022/05/06 MySQL