前段時間開發了一個COM組件配合web前端使用,遇到了C++中調用JS代碼的問題,在網上查了很多資料,現 總結一下,留作以後察看。
C++中調用JS代碼主要有兩種情況:1. IE線程中調用;2. 其他線程調用
1. IE線程中調用:這種情況網上已經有很多資料,下面列出示列代碼:
C++代碼
STDMETHODIMP CJsInvoker::InvokeJsFunc(LONG para1, LONG para2, VARIANT jsFunction, LONG* retValue){ CComPtr<IDispatch> jsCallback; if (jsFunction.vt == VT_DISPATCH) jsCallback = jsFunction.pdispVal; VARIANT arg[2]; arg[0].vt = VT_I4; arg[1].vt = VT_I4; arg[0].lVal = para1; arg[1].lVal = para2; VARIANT pvarRet; jsCallback.InvokeN(static_cast<DISPID>(DISPID_VALUE), arg, 2, &pvarRet); *retValue = pvarRet.lVal; return S_OK;}
JS代碼
<script type="text/javascript"> // 兩個參數的回調方法 function jsCallbackFunc(a, b) { return a + b; } var obj = new ActiveXObject("ComCallJsFunction.JsInvoker"); var retValue = objA.InvokeJsFunc(1, 2, jsCallbackFunc); alert(retValue); // 傳回值為3 </script>
從代碼中可以看出,Js方法作為IDispatch指標傳入COM,C++通過調用其InvokeN 方法實現。