近日做一个网页插件,由于是和其它公司合作,而自己又不会html语言,所以到最后的控件是写了一个vc的demo来测试的,结果碰到了一个有趣的问题,在我的demo里事件是十分好用的,但是在网页中的javascript就是响应不了,这让我十分恼火,在网上查的时候发现了是COM线程模型的问题,因为我是在线程里fire event ,所以在invoke时老是返回E_UNEXPECTED这个错误,最后的解决方法是用:CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream来解决这个问题,CoMarshalInterThreadInterfaceInStream这个主要是在主线程中调用,它主要是将接口指针包装成流的方式传递到另外一个线程,而CoGetInterfaceAndReleaseStream主要工作在发消息的子线程中,它就可以得到主线程包装的接口指针,然后利用此接口指针发送消息即可。
代码如下:
// 包装接口指针到流中
IUnknown* pIUnknown = NULL;
//IStream* pIStream = NULL;
/* QI the original interface pointer for its IUnknown interface. */
m_pNewLaserControl->QueryInterface (IID_IUnknown, (void**)&pIUnknown);
/* Once we get the IUnknown pointer, we serialize it into a stream of bytes. */
if (pIUnknown)
{
::CoMarshalInterThreadInterfaceInStream
(
__uuidof(ILaserDistanceControl),
pIUnknown,
&m_pStream
);
pIUnknown -> Release();
pIUnknown = NULL;
}
// 在线程中用
::CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
ILaserDistanceControl *pIProxyLaserCtrl = NULL;
if (m_pNewLaserControl->m_pStream)
{
::CoGetInterfaceAndReleaseStream
(
m_pNewLaserControl->m_pStream,
__uuidof(ILaserDistanceControl),
(void**)&pIProxyLaserCtrl
);
}