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 火狐下取本地路径实现思路
Apr 02 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
Apr 26 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
Jun 23 Javascript
jquery中checkbox全选失效的解决方法
Dec 26 Javascript
JS实现的车标图片提示效果代码
Oct 10 Javascript
如何检测JavaScript的各种类型
Jul 30 Javascript
jQuery中的on与bind绑定事件区别实例详解
Feb 28 Javascript
详解如何在Vue2中实现组件props双向绑定
Mar 29 Javascript
浅谈vuex之mutation和action的基本使用
Aug 29 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
Dec 28 Javascript
详解JVM系列之内存模型
Jun 10 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学习笔记(毕业设计)
2012/02/21 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
对比分析json及XML
2014/11/28 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
JS控制TreeView的结点选择
2016/11/11 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
vue生成随机验证码的示例代码
2017/09/29 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
2018/09/26 Javascript
解决vue-cli 打包后自定义动画未执行的问题
2019/11/12 Javascript
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
python深度优先搜索和广度优先搜索
2018/02/07 Python
python调用系统ffmpeg实现视频截图、http发送
2018/03/06 Python
深入了解Django中间件及其方法
2019/07/26 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
python中sys模块是做什么用的
2020/08/16 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
Linux管理员面试题 Linux admin interview questions
2016/07/08 面试题
项目开发计划书
2014/01/09 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
小学三好学生事迹材料
2014/08/15 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
python 离散点图画法的实现
2022/04/01 Python