您应该始终编组您的连接点调用。如果不这样做,您可以调用 VB 代码,但它会以随机方式失败(非编组对象),或者根本不起作用(GUI)。
要使用编组,您必须实现几个接口(见下文)。
另一种可能性是将对 VB 的异步调用转换为同步的“获取”调用。
所以你的代码来自(在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) 对每个暴露的对象和连接点重复此操作。
(这应该可以,但是我很久没有尝试过了......)