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

sky-defender 2013-06-27 09:33:14
在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);
}
</script>
...全文
155 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky-defender 2013-08-08
  • 打赏
  • 举报
回复
自己解决 最终在主线程中添加一个MsgWnd,将句柄传递给子线程,子线程在需要的时候,post或者sendmessage给MsgWnd,MsgWnd在调用主线程中的函数,实现了异步调用JS的回调函数
UEAnswer 2013-06-27
  • 打赏
  • 举报
回复
mark,完全不明白,等答案。

87,991

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧