欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

COM组件中调用JavaScript函数详解及实例

程序员文章站 2023-01-10 12:29:42
com组件中调用javascript函数详解及实例 要求是很简单的,即有com组件a在ie中运行,使用javascript(js)调用a的方法longcalc(),该方法...

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对象广泛使用这个方法。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!