COM組件中調(diào)用JavaScript函數(shù)詳解及實(shí)例
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ì)本站的支持!
相關(guān)文章
js原生代碼實(shí)現(xiàn)輪播圖的實(shí)例講解
下面小編就為大家?guī)?lái)一篇js原生代碼實(shí)現(xiàn)輪播圖的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
理解Javascript_07_理解instanceof實(shí)現(xiàn)原理
在《Javascript類型檢測(cè)》一文中講到了用instanceof來(lái)用做檢測(cè)類型,讓我們來(lái)回顧一下2010-10-10
JS解決IOS中拍照?qǐng)D片預(yù)覽旋轉(zhuǎn)90度BUG的問(wèn)題
下面小編就為大家?guī)?lái)一篇JS解決IOS中拍照?qǐng)D片預(yù)覽旋轉(zhuǎn)90度BUG的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
使用js獲取url中的參數(shù)并返回一個(gè)對(duì)象方式
這篇文章主要介紹了使用js獲取url中的參數(shù)并返回一個(gè)對(duì)象方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
JavaScript高仿支付寶倒計(jì)時(shí)頁(yè)面及代碼實(shí)現(xiàn)
在支付寶上我們經(jīng)常會(huì)見(jiàn)到支付寶倒計(jì)時(shí)功能,倒計(jì)時(shí)應(yīng)用非常廣泛,下文給大家介紹js制作支付寶倒計(jì)時(shí)功能,但是里面涉及到,倒計(jì)時(shí),彈框,以及字體圖的相關(guān)知識(shí),感興趣的朋友一起看看吧2016-10-10

