Здравствуйте, Karluha, Вы писали:
K>Есть такая задача. Необходимо преобразовывать IUnknown->Pointer и обратно. Проблема состоит в том, что при преобразовании Pointer->IUnknown экземпляр уже вполне может быть уничтожен. Для безопасного преобразования была написана функция:
[Skip]
K>Все было бы хорошо, но вот почемуто иногда, после уничтожения экземпляра, она приводит к зависанию приложения. Может кто нибудь предолжет более корректную реализацию данной функции?
Самое замечательное в твое проблеме, что надежного решения при привидении IUnknown в Pointer, а потом назад когда Instance может быть уничтожен, просто нету. Простой твой вызов QueryInterface может протереть память и запороть всю аппликацию.
Напрашивается вопрос: для чего была произведено приведение IUnknown в Pointer. Есть догадка — для того чтобы запихтуть эго в какую то структуру, которая поддерживает только указатели.
Напрашивается несколько выходов:
1. Во внутренней структуре сохранять интерфейсы а не указатели. Самое правильное но не всегда реализуемо.
2. При приведении в Pointer вызвать принудительно aIntf._AddRef. Таким образом мы заблокируем уничтожение обьекта. Потом когда внутрення структура будет чистится вызвать _Release. Так мы избавимся от ликов памяти.
3. Создать механизм нотификаци. Тоесть когда обьект уничтожается то он нотифицирует подписчиков что они дожны обновить свои данные.