COM組件中調用JavaScript函數(shù)詳解及實例
更新時間:2017年02月23日 11:45:41 投稿:lqh
這篇文章主要介紹了COM組件中調用JavaScript函數(shù)詳解及實例的相關資料,需要的朋友可以參考下
COM組件中調用JavaScript函數(shù)詳解及實例
要求是很簡單的,即有COM組件A在IE中運行,使用JavaScript(JS)調用A的方法longCalc(),該方法是一個耗時的操作,要求通知IE當前的進度。這就要求使用回調函數(shù),設其名稱為scriptCallbackFunc。實現(xiàn)這個技術很簡單:
1 、組件方(C++)
組件A 的方法在IDL中定義:
[id(2)] HRESULT longCalc([in] DOUBLE v1, [in] DOUBLE v2, [in, optional] VARIANT scriptCallback);
組件A的方法實現(xiàn):
// 假設回調原型為: // scriptCallbackFunc(LONG nCurrentProgress, LONG nTotalProgress, BSTR bstrProgressName); // 此方法由JS腳本來實現(xiàn) STDMETHODIMP CA:: longCalc (DOUBLE v1, DOUBLE v2, VARIANT scriptCallback) { CComPtr<IDispatch> spCallback; if (scriptCallback.vt == VT_DISPATCH) spCallback = scriptCallback.pdispVal; // 參數(shù)準備 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); } // 創(chuàng)建組件并執(zhí)行l(wèi)ongCalc var objA = new ActiveXObject(“MyCom.A”); // 使用回調: 執(zhí)行時在IE狀態(tài)欄顯示進度 objA. longCalc (100, 200, scfDisplayProgress); // 不使用回調 objA. longCalc (100, 200); //--> </script>
3 說明
- 該技術僅適用于腳本。不適合于VB、C++客戶。
- 該技術和連接點、事件無關。
- 微軟的XML DOM對象廣泛使用這個方法。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
用js實現(xiàn)before和after偽類的樣式修改的示例代碼
本篇文章主要介紹了用js實現(xiàn)before和after偽類的樣式修改的示例代碼,具有一定的參考價值,有興趣的可以了解一下2017-09-09nullJavascript中創(chuàng)建對象的五種方法實例
今天上午,非常郁悶,有很多簡單基礎的問題搞得我有些迷茫,哎,代碼幾天不寫就忘。目前又不當COO,還是得用心記代碼哦!2013-05-05重載toString實現(xiàn)JS HashMap分析
用過Java的都知道,里面有個功能強大的數(shù)據(jù)結構——HashMap,它能提供鍵與值的對應訪問。不過熟悉JS的朋友也會說,JS里面到處都是hashmap,因為每個對象都提供了map[key]的訪問形式。2011-03-03JavaScript中Array的filter函數(shù)詳解
這篇文章主要介紹了JavaScript中Array的filter函數(shù)詳解,filter?為數(shù)組中的每個元素調用一次callback函數(shù),W更多具體內容,需要的朋友可以參考一下2022-07-07