VSTO Outlook Получение TimeZoneStruct от назначения - PullRequest
1 голос
/ 13 марта 2019

Короткая версия

Я пытаюсь получить доступ к TimeZoneStruct с помощью VSTO из встречи Outlook. Следующая ошибка выдается при попытке доступа к нему.

System.Runtime.InteropServices.COMException (0x80040102): Object does not support property "http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102".

Интересно, что я могу получить аналогичное свойство, TimeZoneDescription , используя тот же метод без исключений: http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F

Мой код ниже; первый вызов GetProperty завершается успешно, а второй - нет.

//OK returns TimeZone Description string
dynamic tz1 = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F"); 

//NOK throws a COMException
dynamic tzStruct = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102");

Длинная версия

Я разрабатываю плагин, который читает календарь Outlook.

В настоящее время проблема заключается в повторяющихся встречах, которые были созданы в разных часовых поясах с разными настройками летнего времени.

Чтобы найти все встречи в серии повторяющихся собраний, мне нужна информация о часовом поясе.

Первый подход, который я использовал, заключался в получении информации о часовом поясе путем извлечения названия часового пояса. Это работает в большинстве случаев, но не идеально.

Outlook.PropertyAccessor pa = appointment.PropertyAccessor;
dynamic tz1 = pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F");

Возвращает строку, аналогичную (UTC+01:00) Amsterdam, Berlijn, Bern, Rome, Stockholm, Wenen.

Это работает правильно, но встречи, отправленные с ПК на разных языках, или в случае "старых" собраний с "устаревшими" часовыми поясами, которые были удалены в Центре обновления Windows, это работает не очень хорошо.

Я буду получать встречи с компьютеров на других языках, например, этот часовой пояс на французском, и мой компьютер не найдет его. (UTC+03:00) Moscou, Saint-Pétersbourg, Volgograd

Есть также обновления; этот часовой пояс ниже больше не существует. Вологод был введен в свой часовой пояс в UTC + 04: 00 в 2016 году. См. ссылку от Microsoft .

  • Старый: (UTC+03:00) Moscow, St. Petersburg, Volgograd
  • Новое: (UTC+03:00) Moscow, St. Petersburg

Очевидно, что сопоставление имени часового пояса никогда не сработает.

Я сосредоточен на получении полной информации, используя TimeZoneStruct ; что должно позволить мне создать собственный объект TimeZoneInfo; а потом я смогу преобразовать его в местное время.

Моя проблема в том, что при попытке доступа к этой структуре я получаю следующую ошибку: System.Runtime.InteropServices.COMException (0x80040102): Object does not support property "http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102".

Я посмотрел на OutlookSpy и вижу, что свойство действительно доступно.

Я использую .NET Framework 4.6; Outlook 2016; Visual Studio 2015; Windows 8.1.

Есть предложения?

UPDATE

Я пытаюсь получить доступ к этому свойству с помощью VBscript в Outlook Spy и получаю похожую ошибку. По некоторым причинам свойства, которые не являются PT_BINARY, работают. Есть идеи?

вот как повторить эксперимент

Используя OutlookSpy, выберите повторяющуюся встречу. Убедитесь, что вы выбираете мастер и открываете «Текущий элемент», чтобы запустить сценарий для текущего элемента AppointmentItem.

Введите следующий код. Смотрите скриншот для справки.

set msg = AppointmentItem
set pa = msg.PropertyAccessor

debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/8234001F")
debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82310003")
debug.print pa.GetProperty("http://schemas.microsoft.com/mapi/id/{00062002-0000-0000-C000-000000000046}/82330102")

Trying to obtain property with OutlookSpy

1 Ответ

1 голос
/ 13 марта 2019

Outlook любит играть в «Большого брата», чтобы вы не могли изменять или иногда даже получать доступ к некоторым свойствам, которые он считает особенными.

Использование расширенного MAPI (C ++ или Delphi) или Погашение (любой язык, я его автор) вместо OOM - единственный обходной путь.

...