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ì)本站的支持!
新聞熱點(diǎn)
疑難解答
圖片精選