在COM组件中调用JavaScript函数

来源:互联网 发布:linux文件权限777 编辑:程序博客网 时间:2024/04/28 22:24

 

在COM组件中调用JavaScript函数

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

 


 1 1 组件方(C++
 2 
 3 组件A 的方法在IDL中定义:
 4 [id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional] VARIANT scriptCallback);
 5 
 6 组件A的方法实现:
 7 // 假设回调原型为: 
 8 // scriptCallbackFunc(LONG nCurrentProgress, LONG nTotalProgress, BSTR bstrProgressName);
 9 // 此方法由JS脚本来实现
10 STDMETHODIMP CA:: longCalc (DOUBLE v1, DOUBLE v2, VARIANT scriptCallback)
11 {
12     CComPtr<IDispatch> spCallback;
13     if (scriptCallback.vt == VT_DISPATCH)
14          spCallback = scriptCallback.pdispVal;
15     
16 
17     // 参数准备
18     CComVariant varResult;
19     CComVariant avarParams[3];
20     avarParams[0= “开始计算股票”;        // bstrProgressName
21     avarParams[0].vt = VT_BSTR;
22     avarParams[1= 100;                              // nTotalProgress
23     avarParams[1].vt = VT_I4;
24     avarParams[2= 0;                                 // nCurrentProgress
25     avarParams[2].vt = VT_I4;
26     DISPPARAMS params = { avarParams, NULL, 30 };
27 
28 
29     if(spCallback)
30           spCallback->Invoke(0
31                 IID_NULL, 
32                 LOCALE_USER_DEFAULT, 
33                 DISPATCH_METHOD, 
34                 &params&varResult, NULL, NULL);
35 
36     BOOL  bFinished = false;
37     
38 
39     while(!bFinished)
40     {
41          // 计算工作…
42          Sleep(1000);
43          v1 = v1+v2;
44   
45         // 回调客户
46         if(spCallback)
47         {
48             avarParams[0= “正在计算股票…”;
49             avarParams[2= 0;
50             spCallback->Invoke(0
51                          IID_NULL, 
52                          LOCALE_USER_DEFAULT, 
53                          DISPATCH_METHOD, 
54                          &params&varResult, NULL, NULL);
55           }
56 
57           if(…)
58                  bFinished = TRUE;
59      }  // while OK!
60 
61       return S_OK;
62 }
63 
64 
65 2 客户方(JS)
66 
67 <script language="javascript">
68 <!--
69       // 符合回调原型:scriptCallbackFunc
70       function scfDisplayProgress(nCurrentProgress, nTotalProgress, bstrProgressName)
71       {
72              window.status = bstrProgressName + “:”+(nCurrentProgress *100/TotalProgress);
73       }
74  
75       // 创建组件并执行longCalc
76       var objA = new ActiveXObject(“MyCom.A”);
77 
78        // 使用回调: 执行时在IE状态栏显示进度
79        objA. longCalc (100200, scfDisplayProgress); 
80 
81        // 不使用回调
82        objA. longCalc (100200); 
83 //-->
84 </script>
85 
86 3 说明
87 
88 该技术仅适用于脚本。不适合于VB、C++客户。
89 该技术和连接点、事件无关。
90 微软的XML DOM对象广泛使用这个方法。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 房产企业申请破产买的房子怎么办 被业务员骗了买了保险怎么办 孩子特别害怕老师严厉的批评怎么办 4k电视看有线电视不清晰怎么办 移动9.9流量4g网用完了怎么办 东方头条验证码已经被注册了怎么办 打王者两个人吵架被夹在中间怎么办 顾客拿过期的食品过来投诉怎么办 老婆总是埋怨我父母我该怎么办? 代款公司如果使用暴力追债怎么办 法院拍卖款分配有疑意怎么办 法院拍卖买到的房子里有户口怎么办 新注册手机邮箱不和电脑同步怎么办 移动4g盒当月流量封顶怎么办 昆仑加油卡密码忘记了怎么办 昆仑银行e盾密码忘记了怎么办 中石化加油卡密码忘记了怎么办 壳牌加油卡密码忘了怎么办 中国石化加油卡密码忘了怎么办 中石化加油卡密码忘了怎么办 中石化加油卡需要密码忘了怎么办 求不熟领导办事送礼不收怎么办 送礼给领导不收好像很生气怎么办 加油卡没有密码加油后锁住怎么办 个人怎么办中石化油卡怎么开公司票 中石化副卡挂失后钱怎么办 中石化的加油卡丢了怎么办 得仕卡过期3年了怎么办 如果在超市买到过期商品怎么办 华润万家买的豆干过期了吃了怎么办 华润万家购物卡过期了怎么办 杜鹃花水浇多了树叶都掉了怎么办 游客行程因天气原因无法进行怎么办 携程旅游途中提前结束行程怎么办 小区附近商家卖东西很吵怎么办? 小区门口卖东西的喇叭太吵怎么办 我老婆是二婚带的小孩怎么办户口 ck手表带了脱不下来怎么办 消毒柜开孔尺寸高度太高了怎么办 苏宁易购买的东西比专卖店贵怎么办 手机打字键盘上没有语音功能怎么办