国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 語(yǔ)言 > JavaScript > 正文

COM組件中調(diào)用JavaScript函數(shù)詳解及實(shí)例

2024-05-06 15:10:54
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

COM組件中調(diào)用JavaScript函數(shù)詳解及實(shí)例

要求是很簡(jiǎn)單的,即有COM組件A在IE中運(yùn)行,使用JavaScript(JS)調(diào)用A的方法longCalc(),該方法是一個(gè)耗時(shí)的操作,要求通知IE當(dāng)前的進(jìn)度。這就要求使用回調(diào)函數(shù),設(shè)其名稱為scriptCallbackFunc。實(shí)現(xiàn)這個(gè)技術(shù)很簡(jiǎn)單:

1 、組件方(C++)

組件A 的方法在IDL中定義:

[id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional] VARIANT scriptCallback); 

組件A的方法實(shí)現(xiàn):

// 假設(shè)回調(diào)原型為:  // scriptCallbackFunc(LONG nCurrentProgress, LONG nTotalProgress, BSTR bstrProgressName); // 此方法由JS腳本來(lái)實(shí)現(xiàn) STDMETHODIMP CA:: longCalc (DOUBLE v1, DOUBLE v2, VARIANT scriptCallback) {   CComPtr<IDispatch> spCallback;   if (scriptCallback.vt == VT_DISPATCH)      spCallback = scriptCallback.pdispVal;       // 參數(shù)準(zhǔn)備   CComVariant varResult;   CComVariant avarParams[3];   avarParams[0] = “開(kāi)始計(jì)算股票”;    // 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)   {      // 計(jì)算工作…      Sleep(1000);      v1 = v1+v2;       // 回調(diào)客戶     if(spCallback)     {       avarParams[0] = “正在計(jì)算股票…”;       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"> <!--    // 符合回調(diào)原型:scriptCallbackFunc    function scfDisplayProgress(nCurrentProgress, nTotalProgress, bstrProgressName)    {        window.status = bstrProgressName + “:”+(nCurrentProgress *100/TotalProgress);    }      // 創(chuàng)建組件并執(zhí)行l(wèi)ongCalc    var objA = new ActiveXObject(“MyCom.A”);      // 使用回調(diào): 執(zhí)行時(shí)在IE狀態(tài)欄顯示進(jìn)度     objA. longCalc (100, 200, scfDisplayProgress);       // 不使用回調(diào)     objA. longCalc (100, 200);  //--> </script> 

3 說(shuō)明

該技術(shù)僅適用于腳本。不適合于VB、C++客戶。 該技術(shù)和連接點(diǎn)、事件無(wú)關(guān)。 微軟的XML DOM對(duì)象廣泛使用這個(gè)方法。

 感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 湖南省| 温州市| 东莞市| 新津县| 盱眙县| 闽清县| 杨浦区| 隆尧县| 扶沟县| 朔州市| 阳山县| 江达县| 普兰店市| 汉沽区| 达孜县| 岳池县| 长海县| 浦东新区| 兴海县| 新昌县| 乳山市| 图们市| 普兰县| 饶阳县| 文水县| 南康市| 师宗县| 化德县| 蒙阴县| 温州市| 山丹县| 呼图壁县| 宿州市| 沧州市| 英吉沙县| 富川| 东丰县| 宁南县| 南康市| 吐鲁番市| 岫岩|