您应该始终编组您的连接点调用。如果不这样做,您可以调用 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) 在 FinalConstruct() 中创建编组器
FinalConstruct()
{
HRESULT rval = CoCreateFreeThreadedMarshaler( GetControllingUnknown(), &m_pUnkMarshaler.p );
...
}
FinalRelease()
{ ...; m_pUnkMarshaler = 0; }
3) 从 IConnectionPointImplMT 派生您的连接点,并在您可以同时触发多个调用时在内部锁定调用。
4) 不要在对象的方法中无限期地等待,因为您可能会陷入死锁。
5) 对每个暴露的对象和连接点重复此操作。
(这应该可以,但我很久没试过了……)