В этом коде я получаю нарушение прав доступа к памяти 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, ¶ms, 0, NULL, NULL);
}
return hr;
}
Я думаю, что соединения удаляются, когда я повторяю m_vec
, Это правильное предположение? Должен ли я позаботиться о одновременной стрельбе и подписке? Что происходит, когда я звоню getAt
метод CComDynamicUnkArray
объект с за пределами индекса?
Lock
а также Unlock
только вокруг getAt
Это обычная практика, которую я видел в нескольких местах. Нет проблем с одновременной подпиской. Но как я могу защитить себя от одновременной отписки?
Задача ещё не решена.
Других решений пока нет …