падения при 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 шт):
В момент вызова CoUninitialize все созданные COM-объекты должны быть уничтожены. У вас кто-то остается жить и уничтожается уже после уничтожения подсистемы COM. Отсюда и ошибка
Как искать: не вызывать CoUninitialize, а поставить точку останова на combase.dll!CStdMarshal::DisconnectSrvIPIDs. Когда она сработает, посмотреть стек вызовов и попытаться угадать какой объект уничтожается