Погашение обновления встречи Outlook, потенциально вызывающее ошибку сохранения Outlook

У меня есть приложение, которое синхронизирует встречи между Outlook и моим приложением. Код синхронизации использует Redemption для обновления встреч в Outlook.

Когда встреча добавляется в Outlook, мой код улавливает событие добавления элемента, генерирует эквивалентную встречу в моем приложении и добавляет мой идентификатор встречи в качестве свойства пользователя в встрече Outlook, а затем сохраняет его.

Странная проблема, с которой я столкнулся, заключается в следующем:

  1. Один щелчок по дню в обзоре месяца
  2. Текстовое поле отображается в блоке дня, введите тему и нажмите Enter.
  3. Дважды щелкните новую встречу, чтобы сразу открыть ее
  4. Внесите некоторые изменения, например установите напоминание.
  5. Нажмите кнопку сохранения

На этом этапе Outlook покажет мне окно сообщения, в котором говорится: «Элемент не может быть сохранен, потому что он был изменен другим пользователем или в другом окне».

Я нахожу, что это происходит довольно часто, если у меня включена надстройка синхронизации встреч, но никогда не происходит, если я отключу ее.

Похоже, что Outlook обнаруживает изменение моего кода, сохраняя свойство пользователя через Redemption, и ему это не нравится.

Это потому, что Redemption обращается к таблице MAPI напрямую для сохранения данных, в то время как Outlook по-прежнему кэширует COM-объект встречи, когда я открываю его слишком быстро. Чтобы назначенная мною встреча "устарела" к тому времени, когда я хочу ее снова сохранить?

Версия Outlook, с которой я тестирую, - это Outlook 2016.


person Leon Zhou    schedule 17.08.2016    source источник


Ответы (1)


Эта ошибка возвращается, если происходит следующее:

  1. Ваш код (или Outlook) открывает элемент
  2. Погашение открывает элемент
  3. Искупление изменяет предмет
  4. Искупление спасает это
  5. Outlook (или ваш код) изменяет и сохраняет элемент Outlook

Вы можете либо убедиться, что Outlook не открывает элемент в № 1, либо (если он уже открыт) вы можете скопировать элемент Outlook и открыть его с помощью RDOSession.GetRDOObjectfromOutlookObject на шаге № 2.

person Dmitry Streblechenko    schedule 17.08.2016