падения при CoUninitialize()

Есть приложение под WIN состоящее из множества dll. Для работы этого приложения необходим DCOM. Иногда и не очень стабильно происходят исключения после последнего вызова CoUninitialize(). Исключение это не правильный доступ к памяти(0xC0000005: Access violation reading location 0x0000000035BF2B60.). На сколько я понимаю происходит вызов метода Release объекта выгруженного из памяти если смотреть дамп созданный при исключении(combase.dll!CStdMarshal::DisconnectSrvIPIDs(unsigned long dwType) Line 4938 C++). Проблема в том как понять кто не уничтожив объект выгрузился. Не от всех dll есть исходный код. Может как-то можно узнать GUID этого не разрушенного объекта или имя длл которая не его создала и не освободила?


Ответы (1 шт):

Автор решения: Anton Shchyrov

В момент вызова CoUninitialize все созданные COM-объекты должны быть уничтожены. У вас кто-то остается жить и уничтожается уже после уничтожения подсистемы COM. Отсюда и ошибка

Как искать: не вызывать CoUninitialize, а поставить точку останова на combase.dll!CStdMarshal::DisconnectSrvIPIDs. Когда она сработает, посмотреть стек вызовов и попытаться угадать какой объект уничтожается

→ Ссылка