在COM组件中调用JavaScript函数
转载自: http://blog.csdn.net/cheungmine/article/details/1451489
要求是很简单的,即有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对象广泛使用这个方法。
在COM组件中调用JavaScript函数的更多相关文章
- 小程序:如何在wxml页面中调用JavaScript函数
早上过来遇到一个这样的bug: 在计算百分比的时候没有保留小数点后2位,从而导致一些无法整除的结果显示太长 一开始,我以为这是一个很普通的bug,既然wxml在页面{{}}内支持简单的运算,我想也应该 ...
- 在COM组件中调用JS函数
要求是很简单的,即有COM组件A在IE中运行,使用JavaScript(JS)调用A的方法longCalc(),该方法是一个耗时的操作,要求通知IE当前的进度.这就要求使用回调函数,设其名称为scri ...
- VC/MFC中通过CWebPage类调用javascript函数(给js函数传参,并取得返回值)
转自:http://www.cnblogs.com/javaexam2/archive/2012/07/14/2632959.html ①需要一个别人写好的类CWebPage,将其对于的两个文件Web ...
- asp.net中调用javascript自定义函数的方法(包括引入JavaScript文件)总结
通常javascript代码可以与HTML标签一起直接放在前 端页面中,但如果JS代码多的话一方面不利于维护,另一方面也对搜索引擎不友好,因为页面因此而变得臃肿:所以一般有良好开发习惯的程序员都会把 ...
- vue 父组件中调用子组件函数
2019/06/06 在父组件中调用子组件的方法: 1.给子组件定义一个ref属性.eg:ref="childItem" 2.在子组件的methods中声明一个函数.eg: u ...
- VC与JavaScript交互(三) --- CWebPage类调用javascript函数(给js函数传参,并取得返回值)
①需要一个别人写好的类CWebPage,将其对于的两个文件WebPage.h和WebPage.cpp添加到工程中. ②添加WebBrowser控件,在视图/对话框类的头文件中#include &quo ...
- Java 调用 Javascript 函数的范例
在Java 7 以后,可以在Java代码中调用javascript中的函数,请看下面的例子: package com.lee; import java.io.FileNotFoundException ...
- AS与JS相互通信(Flex中调用js函数)
转载自http://www.blogjava.net/Alpha/archive/2009/06/27/284373.html Flex中As调用Js的方法是: 1.导入包 (import f ...
- 【转载】如何在 C#中访问 JavaScript函数?
如何在 C#中访问 JavaScript函数? 时间:13-10-17 栏目:Unity3D教程 作者:zqcyou 评论:0 如何在 C#中访问 JavaScript函数?答案如下:c#代码 ...
随机推荐
- opencart修改后台文件夹名
在使用opencart进行二次开发时,若需要修改后台目录的文件夹名是可以操作的.具体步骤如下: 1.将网站后台文件夹名字改成opencartadmin 2.在该文件夹下找到config.php文件如图 ...
- DELL WIN7系统安装 U盘
1.老毛挑制作U盘启动安装 http://www.laomaotao.net/ 2.下载WIN7 COPY里面的内容到U盘根目录,然后将bootmgr文件更名为win7mgr 3.开进F2修改BIO ...
- JAVA中的正则表达式--待续
1.关于“\”,在JAVA中的正则表达式中的不同: 在其他语言中"\\"表示为:我想要在正则表达式中插入一个普通的反斜杠: 在Java中“\\”表示为:我想要插入一个正则表达式反斜 ...
- execl csv导出
方维js方法:function export_csv() { var inputs = $(".search_row").find("input:[type!='chec ...
- Android系统默认Home应用程序(Launcher)的启动过程源代码分析
在前面一篇文章中,我们分析了Android系统在启动时安装应用程序的过程,这些应用程序安装好之后,还需要有一个 Home应用程序来负责把它们在桌面上展示出来,在Android系统中,这个默认的Home ...
- Hacker(15)----嗅探原理
嗅探指窃听网络中流经的数据包,这里的网络一般指用集线器或路由器组建的局域网.通过嗅探并解析数据包,便可知道数据包中的信息,一旦含有账户密码等隐私信息就可能造成个人资金损失. 嗅探数据包无法通过输入命令 ...
- 禁止 favicon.ico 请求
favicon.ico 图标用于收藏夹图标和浏览器标签上的显示,如果不设置,浏览器会请求网站根目录的这个图标,如果网站根目录也没有这图标会产生 404.出于优化的考虑,要么就有这个图标,要么就禁止产生 ...
- WEB服务器1--开篇
WEB服务器 web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览:可以放置数据文件,让全世界下载.目前最主流的三 ...
- overflow:hidden
原来以为overflow:hidden能隐藏所有溢出的子元素,但今天发现我错了. 对于overflow:hidden的最大误解时:当一个具有高度和宽度中至少一项的容器应用了overflow:hidde ...
- JavaBean和EJB的区别
首先,EJB是指运行在EJB容器中的JavaBean.Tomcat是Web容器的参考实现.一个完整的JavaEE服务器应该包括Web容器和EJB容器.其次,Web容器中无法运行EJB,同时所有的Jav ...