http://bbs.csdn.net/topics/370096340
COM是多线程的,但是奇怪的是只有JS调用了我COM的某个方法,在那个方法里产生事件JS才会收到,百思不得其解,以为是多线程的问题,后来专门编写了测试代码,COM初始化时创建一个弹出窗口,所有线程的事件全部SendMessage到这个窗口,再由这个窗口产生事件通知JS,同时这个窗口加个菜单,通过菜单命令产生事件,这样所有事件都是由这个窗口去通知JS了,结果是,所有线程通过SendMessage通知窗口,再由窗口产生的事件JS都无法收到,只有通过这个窗口菜单产生的事件JS才会收到,有人知道是什么原因或怎么解决吗?
那篇帖子里有两种方法实现JS响应COM事件,我试了这两种方法都成功了,我用了后一种方法测试,这个方法其实不算是JS响应事件,是COM执行JS函数了:
STDMETHODIMP CXXX::SetWindow(VARIANT vtWindow)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
if(vtWindow.vt != VT_DISPATCH)
{
return S_FALSE;
}
CoInitialize(NULL);
vtWindow.pdispVal->QueryInterface(IID_IHTMLWindow2, (void**)&iw);
return S_OK;
}
上面代码中的iw是全局变量,IHTMLWindow2指针
窗口调用JS的test函数:
case WM_USER://自定义窗口消息
{
OutputDebugString("执行JS函数");
VARIANT vt;
if(iw)
iw->execScript(CComBSTR(L"test()"), CComBSTR(L"javascript"), &vt);
break;
}
JS的test函数就是一个alert("COM调用");
页面初始化时JS调用ComObj.SetWindow(window);进行iw的初始化。
COM的线程有事件通知就是SendMessage(ghWnd,WM_USER,0,0);
响应窗口菜单命令同样是SendMessage,结果就是线程发送的消息,页面一点反应都没有,通过菜单操作,页面会弹出消息框。两者的唯一区别是菜单操作和执行JS代码是在同一个线程,而没响应的是其他线程发送的MESSAGE,DebugView能看到“执行JS函数”的信息,说明消息是收到了的,彻底抓狂!