转载自: http://blog.csdn.net/cheungmine/article/details/1451489

要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度。这就要求使用回调函数,设其名称为scriptCallbackFunc。实现这个技术很简单:

1 、组件方(C++)

组件A 的方法在IDL中定义:

  1. [id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional] VARIANT scriptCallback);

组件A的方法实现:

  1. // 假设回调原型为:
  2. // scriptCallbackFunc(LONG nCurrentProgress, LONG nTotalProgress, BSTR bstrProgressName);
  3. // 此方法由JS脚本来实现
  4. STDMETHODIMP CA:: longCalc (DOUBLE v1, DOUBLE v2, VARIANT scriptCallback)
  5. {
  6. CComPtr<IDispatch> spCallback;
  7. if (scriptCallback.vt == VT_DISPATCH)
  8. spCallback = scriptCallback.pdispVal;
  9. // 参数准备
  10. CComVariant varResult;
  11. CComVariant avarParams[3];
  12. avarParams[0] = “开始计算股票”;        // bstrProgressName
  13. avarParams[0].vt = VT_BSTR;
  14. avarParams[1] = 100;                              // nTotalProgress
  15. avarParams[1].vt = VT_I4;
  16. avarParams[2] = 0;                                 // nCurrentProgress
  17. avarParams[2].vt = VT_I4;
  18. DISPPARAMS params = { avarParams, NULL, 3, 0 };
  19. if(spCallback)
  20. spCallback->Invoke(0,
  21. IID_NULL,
  22. LOCALE_USER_DEFAULT,
  23. DISPATCH_METHOD,
  24. ¶ms, &varResult, NULL, NULL);
  25. BOOL  bFinished = false;
  26. while(!bFinished)
  27. {
  28. // 计算工作…
  29. Sleep(1000);
  30. v1 = v1+v2;
  31. // 回调客户
  32. if(spCallback)
  33. {
  34. avarParams[0] = “正在计算股票…”;
  35. avarParams[2] = 0;
  36. spCallback->Invoke(0,
  37. IID_NULL,
  38. LOCALE_USER_DEFAULT,
  39. DISPATCH_METHOD,
  40. ¶ms, &varResult, NULL, NULL);
  41. }
  42. if(…)
  43. bFinished = TRUE;
  44. }  // while OK!
  45. return S_OK;
  46. }
2、 客户方(JS)
[javascript] view plaincopy

  1. <script language="javascript">
  2. <!--
  3. // 符合回调原型:scriptCallbackFunc
  4. function scfDisplayProgress(nCurrentProgress, nTotalProgress, bstrProgressName)
  5. {
  6. window.status = bstrProgressName + “:”+(nCurrentProgress *100/TotalProgress);
  7. }
  8. // 创建组件并执行longCalc
  9. var objA = new ActiveXObject(“MyCom.A”);
  10. // 使用回调: 执行时在IE状态栏显示进度
  11. objA. longCalc (100, 200, scfDisplayProgress);
  12. // 不使用回调
  13. objA. longCalc (100, 200);
  14. //-->
  15. </script>

3 说明

该技术仅适用于脚本。不适合于VB、C++客户。
该技术和连接点、事件无关。
微软的XML DOM对象广泛使用这个方法。

在COM组件中调用JavaScript函数的更多相关文章

  1. 小程序:如何在wxml页面中调用JavaScript函数

    早上过来遇到一个这样的bug: 在计算百分比的时候没有保留小数点后2位,从而导致一些无法整除的结果显示太长 一开始,我以为这是一个很普通的bug,既然wxml在页面{{}}内支持简单的运算,我想也应该 ...

  2. 在COM组件中调用JS函数

    要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度.这就要求使用回调函数,设其名称为scri ...

  3. VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...

  4. asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结

    通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 ...

  5. vue 父组件中调用子组件函数

    2019/06/06 在父组件中调用子组件的方法:  1.给子组件定义一个ref属性.eg:ref="childItem"  2.在子组件的methods中声明一个函数.eg: u ...

  6. VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)

    ①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...

  7. Java 调用 Javascript 函数的范例

    在Java 7 以后,可以在Java代码中调用javascript中的函数,请看下面的例子: package com.lee; import java.io.FileNotFoundException ...

  8. AS与JS相互通信(Flex中调用js函数)

    转载自http://www.blogjava.net/Alpha/archive/2009/06/27/284373.html Flex中As调用Js的方法是:     1.导入包 (import f ...

  9. 【转载】如何在 C#中访问 JavaScript函数?

    如何在 C#中访问 JavaScript函数? 时间:13-10-17 栏目:Unity3D教程 作者:zqcyou 评论:0     如何在 C#中访问 JavaScript函数?答案如下:c#代码 ...

随机推荐

  1. 【转】Android兼容性测试CTS Verifier-环境搭建、测试执行、结果分析

    原文网址:http://www.cnblogs.com/zh-ya-jing/p/4452675.html CTS Verifier算是CTS的一部分,需要手动进行,主要用于测试那些自动测试系统无法测 ...

  2. 修改和获取web.config或app.config文件appSettings配置节中的Add里的value属性 函数

    1: /// <summary> 2: /// 修改web.config或app.config文件appSettings配置节中的Add里的value属性 3: /// </summ ...

  3. 理解 Linux 配置文件分类和使用

    理解 Linux 配置文件分类和使用 本文说明了 Linux 系统的配置文件,在多用户.多任务环境中,配置文件控制用户权限.系统应用程序.守护进程.服务和其它管理任务.这些任务包括管理用户帐号.分配磁 ...

  4. 【HDU1879】继续畅通工程(MST基础题)

    真心大水题...不多说. #include <iostream> #include <cstring> #include <cstdlib> #include &l ...

  5. 异步化DAO的设计和实践

    目前,公司技术规划要求未来所有的服务要全面实现异步化接口,使得每个服务能达到1万/秒的单机性能.我们知道,在一个服务请求中,可能会调用其他服务,还会使用memcache.kv以及mysql等.目前,大 ...

  6. 北京Uber优步司机奖励政策(12月3日)

    用户组:人民优步(适用于12月3日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://w ...

  7. 【Cocos2d-X游戏实战开发】捕鱼达人之游戏场景的创建(六)

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5)    博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...

  8. Linux 文件系统同步

    同步就是将物理内存中dirty的页写入到磁盘中,保证磁盘和物理页之间的内容一致. 触发同步操作的时机: 1.周期性内核线程,扫描脏页,根据一定的规则选择脏页,将页写回到磁盘. 2.如果内核中的脏页过多 ...

  9. C#模拟网站用户登录

    我们在写灌水机器人.抓资源机器人和Web网游辅助工具的时候第一步要实现的就是用户登录.那么怎么用C#来模拟一个用户的登录拉?要实现用户的登录,那么首先就必须要了解一般网站中是怎么判断用户是否登录的. ...

  10. java二维码开发

    之前就写过很多关于二维码的东西,一直没有时间整理一下,所以呢今天就先来介绍一下如何利用java开发二维码.生成二维码有很多jar包可以实现,例如Zxing,QRcode,前者是谷歌的,后者日本的,这里 ...