atl 标准控件在用多线程发消息时VC可以接收但网页无法接收的问题

近日做一个网页插件,由于是和其它公司合作,而自己又不会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
);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值