Как я могу достоверно сказать, что две ссылки инспектора указывают на один и тот же экземпляр инспектора?

[продолжение от Есть ли способ определить, указывают ли две ссылки на интерфейс 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, если обе ссылки ссылаются на одного и того же Инспектора.

Другие вопросы по тегам