[продолжение с Есть ли способ определить, указывают ли две ссылки на интерфейс COM на один и тот же экземпляр? ]
У меня есть ссылки на Inspector
объекты из двух разных источников, и мне нужно знать, какой элемент из одного источника соответствует какому элементу из другого источника. Тем не менее, ни один из подходов, которые мне удалось найти, не сработал (надежно):
Я не могу просто сравнить IUnknown
интерфейсы , так как кажется, что метод Inspectors.Item()
возвращает ссылку на созданный на лету прокси-объект, а не на Сам экземпляр инспектора. Попробуйте: двойной доступ к одному и тому же индексу вернет два совершенно разных указателя.
Сравнение Inspector.CurrentItem.EntryID
тоже не годится. Новый / несохраненный элемент 'EntryID
всегда пуст, и потенциально может быть открыто более одного несохраненного элемента за раз.
Inspector.Caption
или Inspector.CurrentItem.Subject
также неоднозначны.
Временно задает Inspector.CurrentItem.Subject
(или любое другое свойство элемента на самом деле) однозначное значение, а затем ищет его в других видах работ списка, но имеет раздражающий побочный эффект маркировки элемента в инспекторе как «грязный», то есть при повторном закрытии инспектора пользователю будет предложено сохранить элемент (даже если он просто просматривал полученное письмо).
Есть еще идеи?
Контекст:
Я пытаюсь обойти общеизвестную ошибку / функцию, заключающуюся в том, что новые сообщения электронной почты, инициируемые с помощью Simple MAPI (например, «Отправить на> Получатель почты» в контекстном меню проводника), не генерируют событие Inspectors.NewInspector
, что делает невозможным добавить любую функциональность надстройки для этих инспекторов (например, добавление кнопок панели инструментов или выполнение кода при создании сообщения). В моем COM-дополнении у меня есть внутренний список объектов-обёрток для ловли Inspector
-событий. Элементы добавляются и удаляются в этот список путем мониторинга событий Inspectors.NewInspector
и Inspector.Close
.
В качестве альтернативного подхода я использую перехват оболочки: теперь я могу получать уведомления всякий раз, когда создается или уничтожается новое окно инспектора, поэтому это удобное место для поиска и сопоставления моего внутреннего списка объектов-оболочек. с коллекцией Application.Inspectors
и соответственно добавьте или удалите новые или потерянные объекты-оболочки.