Вы всегда должны маршалировать ваши звонки с точки подключения. Если вы этого не сделаете, вы можете вызвать код 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) Повторите это для каждого открытого объекта и точки подключения.
(Это должно сработать, но я давно не пробовал ...)