在COM組件中調用JavaScript函數

來源:互聯網
上載者:User

在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,
                &params, &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, 
                         &params, &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對象廣泛使用這個方法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.