Как я могу достоверно сказать, что две ссылки инспектора указывают на один и тот же экземпляр инспектора?
[продолжение от Есть ли способ определить, указывают ли две ссылки на интерфейс 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
собирать и добавлять или удалять новые или потерянные объекты-оболочки соответственно.
2 ответа
Теперь я обнаружил, что сравнение Inspector.CurrentItem.CreationTime
был достаточно надежным для меня.
Вы также можете использовать оператор Is, чтобы увидеть, ссылаются ли две ссылки на один и тот же объект.
Пример:
Debug.Print InspectorObj1 Is InspectorObj2
Это выведет True в Immediate Window, если обе ссылки ссылаются на одного и того же Инспектора.