在COM组件中调用JS函数

要求是很简单的,即有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组件中调用JS函数

时间: 2024-12-22 23:29:57

在COM组件中调用JS函数的相关文章

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

Flex中As调用Js的方法是:      1.导入包 (import flash.external.ExternalInterface;)      2.使用ExternalInterface.call("Js函数名称",参数)进行调用,其返回的值就是Js函数所返回的值 Js调用As的方法是:      1.导入包 (import flash.external.ExternalInterface;)      2.在initApp中使用ExternalInterface.addCal

微信小程序使用wxs在页面中调用js函数,颜色值格式转换 rgb和十六进制的转换

<wxs module="filter"> var filter = { numberToFix: function (hex) { // 16进制颜色值的正则 // var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/; var reg = getRegExp('^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$','g'); console.log(reg); console.log('结束'); // 把颜色值

a 标签中调用js的几种方法

我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且javascript:协议作为a的href属性的时候不仅会导致不必要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片停止播放.W3C标准不推荐在href里面执行javascript语句 2. a href="javascript:void(0);"

a 中调用js的几种方法

我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且javascript:协议作为a的href属性的时候不仅会导致不必要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片停止播放.W3C标准不推荐在href里面执行javascript语句 2. a href="javascript:void(0);"

C++通过V8调用js函数

现在写个函数,在C++中调用js函数, int V8_Manager::js_load_player_data(Block_Buffer *buf) { //执行V8代码前,必须先进入V8的Isolate,初始化V8运行环境 Isolate::Scope isolate_scope(isolate_); HandleScope handle_scope(isolate_); Local<Context> context = Local<Context>::New(isolate_,

[转]a 标签中调用js的几种方法

我们常用的在a标签中有点击事件:1. a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且javascript:协议作为a的href属性的时候不仅会导致不必要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片停止播放.W3C标准不推荐在href里面执行javascript语句 2. a href="javascript:void(0);"

Java中通过脚本引擎调用js函数

1 import java.io.*; 2 import javax.script.Invocable; 3 import javax.script.ScriptEngine; 4 import javax.script.ScriptEngineManager; 5 import javax.script.ScriptException; 6 import org.slf4j.Logger; 7 import org.slf4j.LoggerFactory; 8 import com.ppcre

JSF页面中使用js函数回调后台bean方法并获取返回值的方法

由于primefaces在国内使用的并不是太多,因此,国内对jsf做系统.详细的介绍的资料很少,即使有一些资料,也仅仅是对国外资料的简单翻译或者是仅仅讲表面现象(皮毛而已),它们的语句甚至还是错误的,很可能会误导使用者. 相对来说,看国内的那些仅仅是翻译过来的文章或书籍不如直接看国外的官方文档或资料来的实在,在我讲述jsf页面中如何使用js调用后台bean方法之前,先给大家说几个国外的资料.在primefaces官方网站上,你可以搜索到几乎所有你需要的东西,primefaces官网为:http:

VC与JavaScript交互(二) ———— 调用JS函数

这一章,我们来动手实践VC调用JS函数. 我们动手写一个HTML,其中包含这样一段JS代码: [html] view plaincopy <script type="text/javascript"> function Add(value1, value2) { return value1 + value2; } </script> 然后我们用WebBrowser加载这个HTML后,在VC中这样来调用这个函数名为Add的JS函数: [cpp] view plai