Как я могу сохранить слабую ссылку на COM-объект в C++?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу сохранить слабую ссылку на COM-объект в C++?

Сообщение Anonymous »

В моем приложении я подключаю различные функции для создания 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Передайте EnvironmentObject как слабую ссылку на SwiftUI View.
    Anonymous » » в форуме IOS
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как Java обрабатывает слабую ссылку на цикл? [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Как Java обрабатывает слабую ссылку на цикл? [закрыто]
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Как Java обрабатывает слабую ссылку на цикл?
    Anonymous » » в форуме JAVA
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • Как Java обрабатывает слабую ссылку на цикл?
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»