none
com组件如何异步调用js函数? RRS feed

  • 问题

  • 在js中使用com组件,将js中的一个函数作为回调函数设置给com组件;在主线程中调用这个回调函数没有问题,但是如果在另一个线程里面调用这个回调函数则总是失败,请哪位大拿解决一下这个问题?

    //初始化创建线程 STDMETHODIMP CJSCallBack::Initialize(void) { // TODO: 在此添加实现代码 DWORD dThreadId; m_hThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CallJspFunctionThread, this, 0, &dThreadId); return S_OK; } //线程函数 UINT CJSCallBack::CallJspFunctionThread(LPVOID param) { CJSCallBack* pCallBack = (CJSCallBack*)param; while(m_bRunThread) { while(m_bCallJspFunc) { pCallBack->CallJsFunction(); m_bCallJspFunc = FALSE; } Sleep(1); } return 0; } //设置回调函数 STDMETHODIMP CJSCallBack::SetJsCallbackFunc(VARIANT scriptCallback) { // TODO: 在此添加实现代码 if (scriptCallback.vt == VT_DISPATCH) { m_spCallback = scriptCallback.pdispVal; } return S_OK; } //调用回调函数 void CJSCallBack::CallJsFunction() { CComVariant avarParams[1]; avarParams[0] = m_szDisplay; //指定回调函数的参数 DISPPARAMS params = { avarParams, NULL, 1, 0 }; if(m_spCallback) { HRESULT hr = m_spCallback->Invoke(0, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &params, NULL, NULL, NULL); } } //触发调用回调函数 STDMETHODIMP CJSCallBack::Print(BSTR bstrToPrint, LONG lWait) { // TODO: 在此添加实现代码 _bstr_t bsPrint = bstrToPrint; char* szPrint = bsPrint; Sleep(500); m_szDisplay = "Succeed to Print"; HRESULT hr = CallPrintFunction(szPrint); if ( FAILED(hr) ) { m_szDisplay = "Failed to Print"; } switch (lWait) { case 0: CallJsFunction(); break; case 1: { m_bCallJspFunc = TRUE; Sleep(30); } break; default: break; } return S_OK; }

    function TestCallBack() {
    		var obj = new ActiveXObject("CallBackForJs.JSCallBack.1"); 		
            var result = obj.Initialize();
    		result = obj.SetJsCallbackFunc(printMsg);		
    		obj.Print("abc",1);
    		obj.UnInitialize();
        }
    function printMsg(msg) {
            alert(msg);
        }


    2013年6月26日 9:22

答案

全部回复