Доброго всем понедельника.
У меня от тоже добрый. На протяжении последнего времени меня, время от времени, долбило сообщение об AV (чур меня, чур меня) при деинициализации COM-а.
Вчера меня оно стало уже конкретно напрягать и сегодня, приготовив ведро с вазелином, решил ... багу до смерти.
Что выяснил.
1. В COM-объекте, используемом в программе, происходила ошибка. Которую он честно возвращал клиенту через SetErrorInfo. Клиент, так уж получалось, на это дело ложил и оставлял объект ошибки висеть в памяти.
2. Объект с описанием ошибки был нестандартный и реализовывался не стандартным комом (в ole32.dll?), а в oledb32.dll. Естественно, интерфейс IErrorInfo у него был.
3. При вызове CoUninitialize,
сначала выгружаются все библиотеки с COM-объектами (в том числе моя и oledb32.dll), а
потом освобождается объект ошибки.
Но объекта ошибки, ясный пень, в памяти уже нет (DLL-то уже тю-тю) — так что появляется злополучный AV
Бага проявляется как на Win2000 так и на XP со всеми обновлениями.
Я требую пустить кровь тому кто реализовывал CoUninitialize или, что хуже, израсходовать на него остатки вазелина!
Пока что решил перед вызовом CoUninitialize самому вызывать SetErrorInfo(0,NULL) — это реально помогает
-- Пользователи не приняли программу. Всех пришлось уничтожить. --