Как я могу достоверно сказать, что две ссылки инспектора указывают на один и тот же экземпляр инспектора? - PullRequest
1 голос
/ 28 ноября 2008

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

1 голос
/ 06 мая 2010

Теперь я обнаружил, что сравнение Inspector.CurrentItem.CreationTime было достаточно надежным для меня.

0 голосов
/ 07 ноября 2011

Вы также можете использовать оператор Is , чтобы увидеть, ссылаются ли две ссылки на один и тот же объект.

Ex:

Debug.Print InspectorObj1 Is InspectorObj2

Это выведет True в Immediate Window, если обе ссылки ссылаются на один и тот же инспектор.

...