您应该始终编组您的连接点呼叫。当你不这样做时,你可以调用VB代码,但它以随机方式(非编组对象)失败,或者只是不起作用(GUI)。
要使用封送处理,您必须实现多个接口(见下文)。
另一种可能性是将异步调用转换为VB同步'fetch'调用。
所以,你的代码去(在C伪代码...):
while(!wait(X))
{
doevents();
}
到:
while(!wait(X))
{
doevents();
fetch_async_data();
}
1)添加一个编组到类将其添加到COM_AGGRGATE表:
CComPtr<IUnknown> m_pUnkMarshaler;
BEGIN_COM_MAP(..)
...
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
END_COM_MAP()
2)创建mar shaller中的FinalConstruct()
FinalConstruct()
{
HRESULT rval = CoCreateFreeThreadedMarshaler(GetControllingUnknown(), &m_pUnkMarshaler.p);
...
}
FinalRelease()
{ ...; m_pUnkMarshaler = 0; }
3)推导从IConnectionPointImplMT您的连接点和内部锁定来电时,你可以在同一时间触发更多然后一个。
4)不要无限期地等待对象的方法,因为你可以在死锁状态下运行。
5)对每个暴露的对象和连接点重复此操作。
(这个应该可以,但是我很久没有试过了......)
非常感谢,我已经整理了它。我搜索了IConnectionPointImplMT并找到了此链接support.microsoft.com/kb/280512/EN-US/。更改2行后提供的代码工作正常(应该是:第148行的m_vec.GetUnknown和第196行的m_vec.GetCookie)。我不清楚为什么我需要添加编组器 - 在链接中没有提到这个问题? – Humbleton 2009-10-14 07:06:42
当你想与vb6线程中的对象进行通信时,需要编组器。如果它不需要,...。 – Christopher 2009-10-14 14:49:56