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 23 Javascript
js综合应用实例简单的表格统计
Sep 03 Javascript
把jQuery的类、插件封装成seajs的模块的方法
Mar 12 Javascript
原生javascript实现的分页插件pagenav
Aug 28 Javascript
JavaScript自定义等待wait函数实例分析
Mar 23 Javascript
理解JS事件循环
Jan 07 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
Aug 20 Javascript
Bootstrap模态框使用详解
Feb 15 Javascript
angularjs2中父子组件的数据传递的实例代码
Jul 05 Javascript
用JS实现简单的登录验证功能
Jul 28 Javascript
vue服务端渲染的实例代码
Aug 28 Javascript
JavaScript中的一些实用小技巧总结
Apr 07 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的错误信息
2006/10/09 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
验证控件与Button的OnClientClick事件详细解析
2013/12/04 Javascript
基于JavaScript怎么实现让歌词滚动播放
2015/11/03 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
JS利用正则表达式实现简单的密码强弱判断实例
2017/06/16 Javascript
AngularJS使用ng-repeat遍历二维数组元素的方法详解
2017/11/11 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
Python中的MongoDB基本操作:连接、查询实例
2015/02/13 Python
对pandas中to_dict的用法详解
2018/06/05 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Django xadmin开启搜索功能的实现
2019/11/15 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
python 图像增强算法实现详解
2021/01/24 Python
python绘制高斯曲线
2021/02/19 Python
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
九年级政治教学反思
2014/02/06 职场文书
老师对学生的评语
2014/04/18 职场文书
防震减灾主题班会
2015/08/14 职场文书
公司财务制度:成本管理控制制度模板
2019/11/19 职场文书
前端JavaScript大管家 package.json
2021/11/02 Javascript