Итерация IConnectionPointImpl во время изменения соединений, нарушение прав доступа к памяти

В этом коде я получаю нарушение прав доступа к памяти CComPtr<IUnknown> punkConnection = m_vec.GetAt(i); линия:

HRESULT FireImpl()
{
HRESULT hr = S_OK;
T * pThis = static_cast<T *>(this);
int count = m_vec.GetSize();

for (int i = 0; i < count; i++)
{
pThis->Lock();
CComPtr<IUnknown> punkConnection = m_vec.GetAt(i);
pThis->Unlock();

IDispatch* pConnection = static_cast<IDispatch *>(punkConnection.p);
if (pConnection == 0)
continue;

DISPPARAMS params = { NULL, NULL, 0, 0 };
hr = pConnection->Invoke(2, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, &params, 0, NULL, NULL);
}
return hr;
}

Я думаю, что соединения удаляются, когда я повторяю m_vec, Это правильное предположение? Должен ли я позаботиться о одновременной стрельбе и подписке? Что происходит, когда я звоню getAt метод CComDynamicUnkArray объект с за пределами индекса?

Lock а также Unlock только вокруг getAt Это обычная практика, которую я видел в нескольких местах. Нет проблем с одновременной подпиской. Но как я могу защитить себя от одновременной отписки?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector