积极答复者
com组件如何异步调用js函数?

问题
-
在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, ¶ms, 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); }
答案
-
- 已标记为答案 Elegentin XieModerator 2013年7月9日 8:01
-
- 已标记为答案 Elegentin XieModerator 2013年7月9日 8:01
全部回复
-
- 已标记为答案 Elegentin XieModerator 2013年7月9日 8:01
-
- 已标记为答案 Elegentin XieModerator 2013年7月9日 8:01