Re: SafePointerToInterface
От: Danchik Украина  
Дата: 10.11.05 13:35
Оценка:
Здравствуйте, Karluha, Вы писали:

K>Есть такая задача. Необходимо преобразовывать IUnknown->Pointer и обратно. Проблема состоит в том, что при преобразовании Pointer->IUnknown экземпляр уже вполне может быть уничтожен. Для безопасного преобразования была написана функция:


[Skip]

K>Все было бы хорошо, но вот почемуто иногда, после уничтожения экземпляра, она приводит к зависанию приложения. Может кто нибудь предолжет более корректную реализацию данной функции?


Самое замечательное в твое проблеме, что надежного решения при привидении IUnknown в Pointer, а потом назад когда Instance может быть уничтожен, просто нету. Простой твой вызов QueryInterface может протереть память и запороть всю аппликацию.

Напрашивается вопрос: для чего была произведено приведение IUnknown в Pointer. Есть догадка — для того чтобы запихтуть эго в какую то структуру, которая поддерживает только указатели.

Напрашивается несколько выходов:

1. Во внутренней структуре сохранять интерфейсы а не указатели. Самое правильное но не всегда реализуемо.

2. При приведении в Pointer вызвать принудительно aIntf._AddRef. Таким образом мы заблокируем уничтожение обьекта. Потом когда внутрення структура будет чистится вызвать _Release. Так мы избавимся от ликов памяти.

3. Создать механизм нотификаци. Тоесть когда обьект уничтожается то он нотифицирует подписчиков что они дожны обновить свои данные.

4. Дальше полет фантазии и смекалки...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.