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的目的分析
Jan 05 Javascript
js获得当前系统日期时间的方法
May 06 Javascript
简介JavaScript中的italics()方法的使用
Jun 08 Javascript
在jQuery中使用$而避免跟其它库产生冲突的方法
Aug 13 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
Sep 27 Javascript
jQuery数据类型小结(14个)
Jan 08 Javascript
javascript html5移动端轻松实现文件上传
Mar 27 Javascript
如何用JavaScript实现动态修改CSS样式表
May 20 Javascript
Vue.js实现拖放效果的实例
Sep 30 Javascript
jquery动态添加文本并获取值的方法
Oct 12 Javascript
基于javascript实现移动端轮播图效果
Dec 21 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
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中source #N问题的解决方法
2014/01/27 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
2017/05/05 PHP
javascript改变position值实现菜单滚动至顶部后固定
2013/01/18 Javascript
Extjs单独定义各组件的实例代码
2013/06/25 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
如何准确判断请求是搜索引擎爬虫(蜘蛛)发出的请求
2015/10/13 Python
python万年历实现代码 含运行结果
2017/05/20 Python
Python数据可视化之画图
2019/01/15 Python
对python多线程SSH登录并发脚本详解
2019/02/14 Python
django迁移数据库错误问题解决
2019/07/29 Python
python虚拟环境完美部署教程
2019/08/06 Python
python定位xpath 节点位置的方法
2019/08/27 Python
pycharm 更改创建文件默认路径的操作
2020/02/15 Python
Python tcp传输代码实例解析
2020/03/18 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
python的dict判断key是否存在的方法
2020/12/09 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
详解淘宝H5 sign加密算法
2020/08/25 HTML / CSS
门卫岗位职责
2013/11/15 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
微笑服务标语
2014/06/24 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
2014年企业员工工作总结
2014/12/09 职场文书
自主招生自荐信格式
2015/03/04 职场文书
幼儿园亲子活动通知
2015/04/24 职场文书