В моем приложении я подключаю различные функции для создания COM-объектов (например, CoCreateInstanceEx), чтобы получать уведомления при каждом создании какого-либо объекта. Я отслеживаю все созданные объекты в std::list и перебираю этот список, чтобы выполнить различные действия (например, проверить, какие объекты OLE были активированы).
Проблема в том, что сейчас при каждом добавлении указателя IUnknown в мой список я вызываю для него IUnknown::AddRef, чтобы убедиться, что он не будет уничтожено, пока я его отслеживаю. Хотя это не то, чего я действительно хочу; время жизни объекта должно быть таким же длинным (или коротким), как и без моего кода трассировки, поэтому я предпочитаю поддерживать слабую ссылку на объекты. Всякий раз, когда последняя ссылка на какой-либо отслеживаемый COM-объект удаляется (и, таким образом, объект уничтожается), я хотел бы получить уведомление, чтобы я мог обновить свою бухгалтерию (например, установив указатель в моем списке на NULL) .*
Как лучше всего это сделать? Прямо сейчас я исправляю (первую) VTable всех созданных объектов, чтобы вызовы IUnknown::Release через первую vtable получали уведомления. Однако это не будет работать для COM-интерфейсов, которые наследуются от нескольких интерфейсов (и, следовательно, имеют несколько виртуальных таблиц), но я не уверен, действительно ли это проблема: учитывая правила реализации QueryInterface, всегда должен быть только один IUnknown. возвращается IUnknown::QueryInterface, верно? Так что я мог бы сделать это, а затем исправить эту виртуальную таблицу.
Более того, этот подход также немного трудоёмок, поскольку он включает в себя создание преобразователей, которые генерируют некоторый код. Я пока реализовал это только для 32-битной версии. Не такая уж большая проблема, но все же.
Мне действительно интересно, нет ли более элегантного способа получить слабую ссылку на COM-объект. Кто-нибудь знает?
*: Следующее, что мне нужно решить, это заставить это работать правильно, если у меня есть активные итераторы (я использую пользовательские объекты итераторов) обход списка COM-объектов. Возможно, мне придется отслеживать активные итераторы и после завершения последнего удалить все нулевые указатели из списка. Или что-то в этом роде.
Подробнее здесь: https://stackoverflow.com/questions/612 ... bject-in-c
Как я могу сохранить слабую ссылку на COM-объект в C++? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение