Outlook RecurrencePattern.Exceptions.Count НЕ обновляется после изменения или удаления вхождения

Я вижу ситуацию, когда объект RecurrencePattern.Exceptions, по крайней мере, свойство Count в Outlook 2010, не всегда обновляется после изменения или удаления повторяющегося события; иногда есть, но чаще нет. На данный момент я не уверен, является ли RecurrencePattern.Exceptions.Count единственным свойством, которое не обновляется, или это вся коллекция Exceptions.

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

Является ли это известной ошибкой в ​​Outlook, и если да, то только в Outlook 2010? Есть ли обходные пути? Это для надстройки, которая в режиме реального времени обновляет базу данных контактов/календаря SQL.


person mdpowersslo    schedule 08.07.2015    source источник


Ответы (2)


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

Видите ли вы данные, обновленные на низком уровне (MAPI)? Используя OutlookSpy, выберите встречу и нажмите кнопку IMessage на ленте OutlookSpy; взгляните на именованное свойство AppointmentRecur. Показывает ли OutlookSpy правильное количество исключений?

ОБНОВЛЕНИЕ:

если есть вариант использования, вы можете попробовать использовать его RDOAppointmentItem (переменная Item ниже может указывать на вашу встречу). Если вы хотите избежать устаревших данных, замените GetRDOObjectFromOutlookObject belwo на GetMessageFromID.

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = Application.Session.MAPIOBJECT
  set Item = Session.GetMessageFromID(Application.ActiveExplorer.Selection(1).EntryID)
  set RdoItem = Session.GetRDOObjectFromOutlookObject(Item)
  set RecurPattern = RdoItem.GetRecurrencePattern
  MsgBox RecurPattern.Exceptions.Count
person Dmitry Streblechenko    schedule 08.07.2015
comment
Я использовал OutlookSpy для наблюдения за элементами, и он правильно сообщал о них. Увидев ответ Юджина на форуме MSDN, я вернулся, перепроверил код и обнаружил, что НЕ выпускаю, а затем обнуляю все ссылки. Как только я это сделал, он, кажется, работает так, как я ожидал. Спасибо вам обоим! - person mdpowersslo; 08.07.2015
comment
Должно быть, где-то висит ссылка; он все еще не обновляется, даже после того, как я избавился от всех ссылок, которые я могу найти. Даже получение EntryID в виде строки, освобождение AppointmentItem перед вызовом метода, который выполняет обработку, и получение новой ссылки в этом методе, похоже, не работает. Есть ли способ найти скрытую ссылку? - person mdpowersslo; 08.07.2015
comment
Как я уже упоминал, это может быть Outlook, кэширующий последнюю встречу, к которой обращались. Если использование Redemption является вариантом, вы можете попробовать использовать его объект RDOAppoinmtmentItem. - person Dmitry Streblechenko; 08.07.2015
comment
хм, я обнаружил, что даже OutlookSpy НЕ всегда сообщает о правильном количестве исключений, хотя, похоже, он работает лучше, чем то, что я получаю. Дмитрий, а как сделать так, чтобы каждая ссылка была деблокирована/обнулена? - person mdpowersslo; 09.07.2015
comment
Когда вы нажимаете кнопку IMessage, OutlookSpy считывает свойство MAPIOBJECT текущего выбранного элемента. Поэтому, если Outlook кэширует элемент, вы можете получить устаревшие данные. Будет ли работать лучше, если вы нажмете кнопку IMAPIFolder и дважды щелкните встречу на вкладке GetContentsTable? В этом случае объектная модель Outlook вообще не используется, а IMessage открывается с помощью IMsgStore::OpenEntry. - person Dmitry Streblechenko; 09.07.2015
comment
Дмитрий, есть ли способ получить РЕАЛЬНОЕ количество исключений и список исключений? Предоставляет ли Redemption такую ​​возможность? - person mdpowersslo; 09.07.2015
comment
Да, см. обновленный ответ выше. Чтобы не ставить дату Outlook, замените GetRDOObjectFromOutlookObject на GetMessageFromID. - person Dmitry Streblechenko; 09.07.2015

Вот что сообщает MSDN:

Когда вы работаете с элементами повторяющихся встреч, вы должны освободить все предыдущие ссылки, получить новые ссылки на элемент повторяющихся встреч перед доступом к элементу или его изменением и освободить эти ссылки, как только закончите и сохраните изменения. Эта практика применяется к повторяющемуся объекту AppointmentItem и любому объекту Exception или RecurrencePattern. Чтобы освободить ссылку в Visual Basic для приложений (VBA) или Visual Basic, задайте для этого существующего объекта значение Nothing. В C# явно освободите память для этого объекта.

Обратите внимание, что даже после того, как вы освободите свою ссылку и попытаетесь получить новую ссылку, если все еще существует активная ссылка, удерживаемая другой надстройкой или Outlook, на один из вышеуказанных объектов, ваша новая ссылка все равно будет указывать на исходящий объект. актуальная копия объекта. Поэтому важно, чтобы вы выпустили свои рекомендации, как только вы закончите повторяющуюся встречу.

В C# используйте System.Runtime.InteropServices.Marshal. ReleaseComObject, чтобы освободить объект Outlook после завершения его использования. Затем задайте для переменной значение Nothing в Visual Basic (null в C#), чтобы освободить ссылку на объект. См. раздел Систематическое освобождение объектов. для получения дополнительной информации.

person Eugene Astafiev    schedule 08.07.2015